Java自定义缓冲区MyBufferedReader

package IODemo;

import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;


/**
 * 自定义的读取缓冲区。其实就是模拟一个BufferedFileReader.
 * 
 * 分析:
 * 缓冲区中无非就是封装了一个数组,
 * 并对外提供了更多的方法对数组进行访问。
 * 其实这些方法最终操作的都是数组的角标。
 * 
 * 缓冲的原理:
 * 其实就是从源中获取一批数据装进缓冲区中。
 * 在从缓冲区中不断的取出一个一个数据。
 * 
 * 在此次取完后,在从源中继续取一批数据进缓冲区。
 * 当源中的数据取光时,用-1作为结束标记。 
 * 
 * 
 * @author Administrator
 *
 */
public class MyBufferedReader {

 public static void main(String args[]) 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);
  }
  bufr.myClose();

 }

 private void myClose() throws IOException {
  r.close();
 }

 /**
  * @param args
  */
 private FileReader r;

 // 自定义缓冲区,需要关联一个被缓冲的对象,所以在构造函数中传入一个FileReader对象
 public MyBufferedReader(FileReader r) {
  this.r = r;
 }

 // 定义指针标记,用于操作缓冲数组中的元素,指针不断后移,当操作到最后一个元素后,指针应该归零。
 private int pos = 0;
 private char[] buf = new char[1024];
 // 定义计数器,用于统计缓冲区中的元素个数,当该数为0时,继续从源取数据到缓冲区中
 private int count = 0;
    //此处犯了一个错误,else-if和多个if的区别没有搞清楚
 /*
  * if(a){
  * b;
  * }
  * if(c){
  * d;
  * }
  * a,c两个条件都会判断,但如果第二个换成else-if则第一个满足以后,就不会判断第二个
  */
 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;

 }

 public String myReadLine() throws IOException {
  StringBuilder sb = new StringBuilder();
  int ch = 0;
  while ((ch = myRead()) != -1) {
   if (ch == '
') {
    continue;
   }
   if (ch == '
') {
    return sb.toString();
   }
   sb.append((char) ch);
  }
  // 这一步是为了保证将缓冲区中的数据全部读出,以免源中最后以后没有'
'换行结束符号
  // 但是数据已经读入到缓冲区中,保证数据的完整性,以免遗漏数据。
  if (sb.length() != 0) {
   return sb.toString();
  }

  return null;
 }

}
原文地址:https://www.cnblogs.com/ysw-go/p/5283005.html