一、缓冲区原理
原理:临时存储数据的方法,减少对设备操作的频率,提高了效率,其实就是将数据临时存储到了内存(数组)中。
图解:
二、模拟一个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(); }