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