public class myBufferedReaderDemo {
public static void main(String[] arg) throws IOException{
FileReader fr = new FileReader("demo.txt"); MyBufferedReader bufr = new MyBufferedReader(fr); String line = null; while((line = bufr.myReadLine()) != null){ System.out.println(line); } }}//自定义缓冲区文件
/*
* 自定义的读取缓冲区。其实就是模拟一个BufferedReader * 分析: * 缓冲区无非就是封装一个数组 * 并对外提供更多的方法对数组进行访问。 * * 缓冲的原理: * 其实就是从源中获取一批数据装进缓冲区。 * 在缓冲区中不断的去处一个一个数据。 * * 在此次取完后,在从源中继续取一批数据进缓冲区。 * 当源中的数据取光时,用-1作为结束标记。 * * * */public class MyBufferedReader {
private FileReader r; //定义一个字符数组作为缓冲区 private char[] buf = new char[1024]; //定义一个指针用于操作这个数组的元素,当操作到最后一个元素后,指针应该归零。 private int pos =0; //定义一个计数器用于记录缓冲区的数据个数,当该数据减到0,就从源中继续获取数据到缓存区。 private int count =0; MyBufferedReader(FileReader fileReader){ this.r = fileReader; } public int myRead() throws IOException{ //优化后的代码 if (count ==0) { count = r.read(buf); pos = 0; } if (count < 0) { return -1; } char ch = buf[pos++]; count --; return ch; /* //1.从源中获取一批数据到缓冲区。需要先做判断,只有计数器为0时,才需要从源中获取数据。 if (count == 0) { count = r.read(buf); if (count < 0) { return -1; } //每次获取数据到缓冲区时,角标为0 pos = 0; char ch = buf[pos]; pos ++; count --; return ch; }else if (count > 0) { char ch = buf[pos]; pos ++; count --; return ch; } */ } public String myReadLine()throws IOException { StringBuilder sb =new StringBuilder(); int ch = 0; while((ch= myRead()) != -1){ if (ch == '\r') { continue; } if (ch == '\n') { return sb.toString(); } sb.append((char)ch); } if (sb.length() != 0) { return sb.toString(); } return null; } public void myClose() throws IOException{ this.r.close(); }}