在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;
}
}