在Reader和Writer类中,每次只能取单个元素或我们自己指定大小数组的元素。效率低。为了简化我们自身创建数组的步骤,产生了新的技术缓冲区。
缓冲的原理:原来都是用源对硬盘上的数据进行操作,而缓冲区的出现就是一个很大的数组,我们把硬盘上的东西一次存储很多到数组上,原来需要多次操作的东西现在按一批一批来处理,这样提升了效率。

下面是自定义的缓冲区类,和java提供的缓冲区实现相同的功能。

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

class Mybuffereddemo {
     private FileReader fr;
     char [] buff=new char[1024];
      int count=0;
      int pos=0;
     Mybuffereddemo(FileReader fr)
     {
    	 this.fr=fr;
     }
     /*
             缓冲区对象的read()方法读取的是缓冲区中的数据,使效率更快
        *实现步骤 
      * 1.用FileReader的read方法读取到缓冲区数组buff中
      * 2.设定一个计数器,和数组的下标用来记录,数组中元素的个数和指向数组元素的序号
      * 3.使用FileReader的read方法会返回一个值,表示读取到的数据个数
      * 4.如果个数为空返回-1,继续使用FileReader的read方法获取数据,同时把数组的下标指针清零
      * 5.每返回一个数据pos++,count--,直到count为零,重新在磁盘中读取数据
      *      */
	public int read() throws IOException
	{
		if(count==0)
		{
			count=fr.read(buff);//重新读取,数组角标设为零从头遍历
			pos=0;
		}
		if(count<0)//代表所有在硬盘中的元素全部被读取完
		{
			return -1;
		}
		count--;
		return buff[pos++];
	}
	/*缓冲区中的readline方法其实利用了自身的read方法,其中有一个容器如StringBuider用来缓存字符串
	 * 如果读到的字符串有回车符号,立刻返回字符串。
	 */
	public String readline() throws IOException
	{
		StringBuilder sb=new StringBuilder();
		int  i=0;
		while((i=read())!=-1)
		{   
			if(i=='\n')
				return sb.toString();
			sb.append((char)i);
		}
		if(sb.length()>0)//健壮性判断
			return sb.toString();
		return null;
	}
}