带Buffered是有默认缓冲区,不容易在读大文件时丢数据。而且被Buffered装饰之后,发现copy一个大图片比不带Buffered速度快。你可以自己试试。当然我们可以自定义一个缓冲区数组。将要读的数据放到自定义数组中。建议在以后的开发中,使用Buffered。这时我写的BufferedReader的底层代码,并加上注释,自己看看就知道了。其实Buffered底层就是封装一组数组。
import java.io.IOException;
import java.io.Reader;
public class MyBufferReader {
private Reader r;
char[] buf=new char[1024];
int index=0;//代表的是char数组的角标
int count=0;//代表的是char数组的长度
public MyBufferReader(Reader r) {
this.r=r;
}
public int myRead() throws IOException{
//当数组长度变成零时,再取目标的文字放到数组中
if(count==0){
count=r.read(buf);
index=0;//每次取完,将角标重置为零
}
//当文本中文字取完,返回-1.
if(count<0){
return -1;
}
//长度每次减1
count--;
//所取数组的角标增一
index++;
return buf[index-1];
}
public String myReadLine() throws IOException{
StringBuilder sb=new StringBuilder();
int ch=0;
while((ch=myRead())!=-1){
//因为在windows中换行是\r\n
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{
r.close();
}
}
|