IO操作中缓冲区原理

一、缓冲区原理

原理:临时存储数据的方法,减少对设备操作的频率,提高了效率,其实就是将数据临时存储到了内存(数组)中。
图解:



二、模拟一个BufferedReader

根据缓冲区原理图解,试着实现自己的BufferedReader
public class MyBufferedReader{
	    //1,持有一个流对象
	    private Reader r;

	    //2,因为是缓冲区对象,所以内部必须维护一个数组
	    private char[] buffer = new char[1024];

	    //3,定义角标
	    private int index = 0;

	    //4,定义变量,记录数组中元素的个数
	    private int count = 0;

	    // 一初始化就必须明确被缓冲的对象
	    public MyBufferedReader(Reader r){
		super();
		this.r = r;
	    }
	    
	    /**
	     *读取一个字符,而且是高效的。
	     */
	    public int myRead() throws IOException {
		//通过被缓冲流对象的read方法,就可以将设备上的数组存储到数组中。
		if(count == 0){
		    count = r.read(buffer);
		    index = 0
		}
		if(count<0){
		    return -1;
		}
		char ch = buffer[index];
		index++;//每取一次,角标要自增
		count--;//取出一个,数组的数量要减少,一旦减到0,就再从设备上获取一批数据存储到数组中。

		return ch;
	    }

	    /**
	     *读取一行文本
	     */
	    public String myReadLine() throws IOException{
		//1,定义临时缓冲区,用于存储一行文本
		StringBuilder sb = new StringBuilder();
		//2,不断调用myRead方法从缓冲区中取出数据
		int ch = 0;
		while((ch=myRead())!=-1){
		    //在存储前要判断行终止符
		    if(ch=='\r')
		        continue;
		    if(ch=='\n')
			return sb.toString();

		    //将读到的字符进行临时存储
		    sb.append((char)ch);
		}
		//如果文本结尾处有数据,但没有行终止符,数据已被读到,并存储到StringBuilder中,只要判断StringBuilder的长度即可。
		if(sb.length!=0){
		    return sb.toString();
		}
		return null;
	    }

	    /**
	     *定义一个缓冲区的关闭方法
	     */
	    public void myClose() throws IOException {
		//其实就是关闭被缓冲区的流对象
		r.close();
	    }
	}

测试类
	public static void main(String[] args) throws IOException{
	    FileReader fr = new FileReader("tempfile\\bufw.txt");
	    MyBufferedReader myBufr = new MyBufferedReader(fr);
	    String line = null;
	    whlie(line=myBufr.myRead()!=null){
		System.out.println(line);
	    }
	    myBufr.myClose();
	}

### Java IO 流中缓冲区作用解释 在 Java 的 IO 操作中,缓冲区的主要目的是提高数据读写效率。通过引入缓冲机制,可以减少底层物理设备(如磁盘或网络接口)的实际访问次数,从而显著提升性能。 #### 缓冲区的工作原理 当程序使用未带缓冲的流(如 FileInputStream 或 FileOutputStream)进行文件读取或写入时,每次调用 read() 或 write() 方法都会触发一次实际的 I/O 操作[^1]。这种频繁的操作会带来较大的开销,尤其是在处理大量小规模的数据传输时。而带有缓冲功能的流(如 BufferedInputStream 和 BufferedOutputStream),会在内存中分配一块缓冲区域来暂存数据[^2]。对于输入流来说,它一次性从源中读取较大块的数据到缓冲区;而对于输出流,则先将数据存储到缓冲区,在达到一定量后再统一写出。 #### 字节缓冲流的具体实现 以下是基于 `BufferedInputStream` 和 `BufferedOutputStream` 的简单代码示例: ```java import java.io.*; public class BufferExample { public static void main(String[] args) throws IOException { byte buffer[] = new byte[8]; // 定义一个长度为8的字节数组作为临时容器 try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("input.txt")); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("output.txt"))) { int bytesRead; while ((bytesRead = bis.read(buffer)) != -1) { // 从输入流中按缓冲大小读取数据 bos.write(buffer, 0, bytesRead); // 将读取的内容写入输出流 } } catch (IOException e) { System.out.println(e.getMessage()); } } } ``` 上述代码展示了如何利用缓冲流高效地复制文件内容。注意这里使用的 `try-with-resources` 结构能够自动关闭资源[^3]。 #### 性能优势分析 采用缓冲技术后,即使应用程序请求少量多次的数据交换,由于存在中间层缓存,真正到达硬件层面的动作被大大压缩了频率。例如,默认情况下,`BufferedInputStream` 可能设置了一个内部数组大小约为 8KB ,这意味着除非必要,否则不会每轮循环都去触碰外部介质。 ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值