package cn.com.mybufferedreader;
import java.io.FileReader;
import java.io.IOException;
/**
* 自定义缓冲区,模拟BufferedReader
* @author Administrator
*
*分析:缓冲区就是封装了一个数组,并对外提供方法对数组进行访问,
* 方法最终操作的是数组的指针(角标)
*
*缓冲区的原理:
* 1.从源文件中获取一批数据装进缓冲区(数据)
* 2.再从缓冲区(数组)中取出一个一个的数据
*注意:在此次取完之后,继续从源文件中取数据到缓冲区,数据为空时,用-1作为结束标记
*/
public class MyBufferedReader {
private FileReader f;
//创建全局数组,作为缓冲区
private char[] buf=new char[1024];
//定义一个指针用来操作这个数组中的元素,操作到最后一个元素时,pos归零
private int pos=0;
//定义一个计数器用来记录缓冲区(数组)中的数据个数,当数据个数为零,就从源文件中继续获取数据到缓冲区中(数组)
private int count=0;
MyBufferedReader(FileReader f){
this.f=f;
}
/**
* myRead()方法从缓冲区中一次取一个字符
* @return
* @throws IOException
*/
public int myRead() throws IOException{
if(count==0){
count=f.read(buf);
pos=0;
}
char ch=buf[pos++];
pos++;
count--;
if(count<0)
return -1;
/*
//1.从源文件中获取一批数据到缓冲区,先判断,只有计数器为0时,才需要从源中获取数据
if(count==0){
count=r.read(buf);
if(count<0)
return -1;
//每次获取完数据到缓冲区(数组)后,指针(角标)为0
pos=0;
char ch=buf[pos];
pos++;
count--;
return ch;
}else if(count>0){
char ch=buf[pos];
pos++;
count--;
return ch;
}
*/
return ch;
}
public String myReadLine() throws IOException{
//创建一个缓冲区(数组),StringBuilder是一个可变的字符序列
StringBuilder sb=new StringBuilder();
int ch=0;
while((ch=myRead())!=-1){
//读到'\r',继续读下一个数据
if(ch=='\r')
continue;
//读到'\n',返回读到数据得字符串
if(ch=='\n')
return sb.toString();
//将从缓冲区中读到的字符,存储到缓存行数据的缓冲区中(sb数组)
sb.append((char)ch);
}
return null;
}
public void myClose() throws IOException {
f.close();
}
}
|
|