手写自己的BufferedReader

1.IO

IO有两大体系,一个是字节输入输出流,一个是字符输入输出流,我所要写的是关于字符输入流

1.1FileReader

字符输入流,以字符为单位的通过系统的IO操作来读取硬盘上面的文件,每次的读取操作都需要去调用系统的IO操作
1.2BufferedReader
缓冲字符输入流,以字符为单位的通过系统的IO操作来读取硬盘上面的文件,但是不同的是他每次的读取操作不是都要去调用系统的IO操作,我们每次在初始化一个BufferedReader对象时,都会初始化一个大小为4096的char数组,我们看BufferedReader源码时,我们会发现read()方法有重写,为什么要重写呢,我测试了一下

我们可以看到没有调用read()方法时,数组没有任何内容,而第一次调用read方法之后,它先通过系统的IO操作去调用read(数组对象),然后来操作数组得到内容,BufferedReader也给我们提供了readLine()这个简便的读取文本方法
1.3写出我们自己的BufferedReader
package cn.itcast.bufferIo;


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


public class MyBufferedReader {
    
private static final int BUFFER_SIZE = 1024;
//需要通过FileReader来调用底层IO操作
private FileReader fr;
//缓存区
private char ch[] ;
//下标
private  int index = 0;
//计数器
private int count;

/*
* 初始化FileReader对象
* 以及初始化缓冲区(char数组)
*/
public MyBufferedReader(FileReader fr){
this.fr = fr;
ch = new char[BUFFER_SIZE];
}
/*
* 定义自己读取单个字符的read方法,并且在里面调用系统的IO操作
*/
public int myReader() throws IOException{
if(count == 0){
//读取文本内容放在缓冲区(char数组)
count = fr.read(ch);
index = 0;
}
if(count<0){
return -1;
}
int re = ch[index];
index++;
count--;
return re;

}
/*
* 定义读取一行的方法
*/
public String myReaderLine() throws IOException{
int i = 0;
StringBuffer sb = new StringBuffer();
while((i = myReader()) != -1){
if((char)i == '\r')
continue;
if((char)i == '\n')
   return sb.toString();

sb.append((char)i);

}
if(sb.length() != 0){
return sb.toString();
}
return null;
}
/*
* 关闭输入流
*/
public void myClose() throws IOException {
fr.close();

}

}
package cn.itcast.bufferIo;


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


public class BufferedTest {
  public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("demo1.txt");
MyBufferedReader myBuff = new MyBufferedReader(fr);
String value = myBuff.myReaderLine();
System.out.println(value);
value = myBuff.myReaderLine();
System.out.println(value);
value = myBuff.myReaderLine();
System.out.println(value);
value = myBuff.myReaderLine();
System.out.println(value);
value = myBuff.myReaderLine();
System.out.println(value);
myBuff.myClose();
}
}
控制台
5521
432  121111111111111113
532130.sddsdssadasdasdasdas            
null
null


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值