我们都知道BufferedReader是一个缓冲区的读取流,内部需要读取功能的成员,也就是Reader的子类。我么可以这样实现:
1:内部定义字符数组,相当于缓冲区,提高了效率
2:操作数组的下标
3:统计字符的个数
public class Demo11 { public static void main(String[] args) throws IOException {<pre name="code" class="java"><span style="white-space:pre"> </span>//创建输入流FileReader fr = new FileReader("src/temp.txt");
MyBufferedReader mbr = new MyBufferedReader(fr); // int num = 0; // while ((num = mbr.myRead()) != -1) { // System.out.print((char) num); // } String line = null; while ((line = mbr.myReadLine()) != null) { System.out.println(line); } mbr.myClose(); } } class MyBufferedReader { private Reader r; // 真正读取功能的类 private char[] arr = new char[512];// 相当于缓冲区 private int index; // 数组下标 private int count; // 统计缓冲区中字符个数 public MyBufferedReader(Reader r) { this.r = r; } // 实现一次读取一个的功能 public int myRead() throws IOException { // 缓冲区中是否有数据 if (count == 0) { // 从文件中读取数据到缓冲区,返回值读取的 字符数 count = r.read(arr); index = 0; // 下标为0 } if (count < 0) // 文件末尾 return -1; // 从缓冲区中读取一个字符 int num = arr[index]; index++;// 下标+1 // 数量-1 count--; return num; } // 一次读取一行 public String myReadLine() throws IOException { StringBuilder sb = new StringBuilder(); int num; while ((num = myRead()) != -1) {//只要是没有读到一句话的末尾那么就继续读 if (num == '\r')//如果是遇到的空格那么就继续 continue; else if (num == '\n')//如果是换行的话那么就停止读取 返回本行的文字 return sb.toString(); else sb.append((char) num); } return null; } // 关闭流 public void myClose() throws IOException { r.close(); } }
这样我们就实现了模拟BufferedReader的效果。