package io.charstream.Mybuffer;
import java.io.FileReader;
import java.io.IOException;
import com.sun.org.apache.regexp.internal.recompile;
import sun.util.resources.hr.CalendarData_hr;
/*
* 自定义的读取缓冲区 其实就是模拟的BufferReader
*
* 分析:
* 缓冲区中无非就是封装了一个数组
* 并对外提供了更多的方法对数组进行访问
* 其实这些方法最终操作的都是数组的角标
*
* 缓冲的原理:
* 其实就是从源中获取一批数据装进缓冲区中
* 再从缓冲区中不断的取出一个一个数据
*
* 在此次取完后 在从源中继续取一批数据进缓冲区
* 当源中的数据取光时 用-1作为结束标记
*
*
*/
public class MyBufferReader {
private FileReader r;
//定义一个数组作为缓冲区
private char[] buf=new char[1024];
//定义一个指针用于操作这个数组中的元素 当操作到最后一个元素后 指针应该归零
private int pos=0;
//定义一个计数器用于记录缓冲区中的数据个数 当该数据减为0时 就从源中继续获取数据到缓冲区中
private int count=0;
public MyBufferReader(FileReader r) {
this.r=r;
}
/*
* 该方法从缓冲区一次取一个字符
*/
public int myRead() throws IOException {
if(count==0) {
count=r.read(buf);
pos=0;
}
if(count<0)
return -1;
char ch=buf[pos];
pos++;
count--;
return ch;
/* //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--;
}*/
}
public String myReadLine() throws IOException {
StringBuilder sb=new StringBuilder();
int ch=0;
while((ch=myRead())!=-1) {
if(ch=='\r')
continue;
if(ch=='\n')
return sb.toString();
//将从缓冲区中读到的字符,存储到缓存行数据的缓冲区
sb.append((char)ch);
}
// if(sb.length()!=0)
// return sb.toString();
return null;
}
public static void main(String[] args) {
}
public void Myclose() throws IOException {
r.close();
}
}
Java IO 自己实现缓冲区
最新推荐文章于 2021-10-25 23:51:07 发布