package day8_17io;
import java.io.*;
/*模拟字符缓冲读入流BufferedReader
分析:
1要属于流的体系
2要有一个Reader类型的成员变量
3要有一个带参数的构造方法接受外部传入的流对象
4模拟ReadLine(),实现读一行的功能
5关闭流
装饰设计模式由这里产生,应用于整个java
装饰设计模式:基于已有的功能去实现增强的功能
*/
class MyBufferedReader extends Reader{
//2要有一个Reader类型的成员变量
FileReader reader;
//3要有一个带参数的构造方法接受外部传入的流对象
public MyBufferedReader(FileReader reader) {
this.reader=reader;
}
//4模拟ReadLine(),实现读一行的功能
/*
* 分析:要有返回值:String
*不需要参数
*/
public String myReaderLine() throws IOException
{
//a要准备一个临时的可变字符串,存储当前行的数据
StringBuffer buffer=new StringBuffer();
//b开始使用reader的read()方法去读取字符
int num=0;
while((num=reader.read())!=-1) {
if(num=='\r')
continue;
else if(num=='\n')
return buffer.toString();
else
buffer.append((char)num);//append没有自动是别的能力,不强转存的是ascii码
}
//1当文本没有内容的时候的处理
if(buffer.length()==0)
return null;
//2当文本只有一行的时候,没有使用换行符
return buffer.toString();
//这里有提高效率功能
}
@Override
public int read(char[] cbuf, int off, int len) throws IOException {
return 0;
}
@Override
public void close() throws IOException {
//将流对象关闭
//将自己关闭
this.reader.close();
}
}
public class Demo11 {
public static void main(String[] args) throws IOException {
MyBufferedReader myBufferedReader=new MyBufferedReader(new FileReader("D:\\a.txt"));
String data=null;
while((data=myBufferedReader.myReaderLine())!=null) {
System.out.println(data);
System.out.println();
}
myBufferedReader.close();
}
}