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();
	}

猜你喜欢

转载自blog.csdn.net/biedazhangshu/article/details/49307135