自定义字符输入流的包装类,通过这个包装类对底层字符输入流进行包装,让程序通过这个包装类读取某个文本文件(例如,一个java源文件)时,能够在读取的每行前面都加上有行号和冒号。
package com.itheima;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;
import java.io.Reader;
/**
*自定义字符输入流的包装类,通过这个包装类对底层字符输入流进行包装,
*让程序通过这个包装类读取某个文本文件(例如,一个java源文件)时,
*能够在读取的每行前面都加上有行号和冒号。
*分析:
*通过题意可以的出:需要自定义字符输入流的包装类,底层使用的是Rader类,同时程序中一次读取一行,
*需要对换行符和回车符做为一行的结束标志,自定义类完成后,还需要在测试类中测试,并且添加行号和冒号
*/
public class Test5 {
public static void main(String[] args) throws IOException {
// 创建自定义对象
MyBufferReader mbr= new MyBufferReader(new FileReader("1.txt"));
// 创建跟踪行号缓冲字符输入流
LineNumberReader lnr =new LineNumberReader( new FileReader("1.txt"));
// 定义一个对象用来存储读取的字符
String line = null;
// 使用自定义对象读取内容、
while((line = mbr.readerLine())!=null){
// 使用跟踪行号缓冲字符输入流读取字符
while((line = lnr.readLine())!=null){
// 在输出时添加行号和冒号,并打印这个字符串、
System.out.println(lnr.getLineNumber()+":"+line);
}
}
// 关闭方法
lnr.close();
mbr.close();
}
}
class MyBufferReader{
// 定义一个字符输入流
private Reader r;
// 构造方法
MyBufferReader(Reader r){
this.r =r;
}
// 自定义读取一行数据
public String readerLine() throws IOException{
// 创建一个字符缓冲区对象用来存储这个每次读取的字符
StringBuilder sb = new StringBuilder();
// 定义一个结束标志ch
int ch =0;
// 读取字符、
while((ch=r.read())!=-1){
// 在windows系统下 判断结束的标志是回车加换行两个字符,如果 这个等 于回车了,那么就去读取换行字符
if(ch=='\r'){
// 结束读取回车,进行下次读取换行
continue;
}
// 如果是读取到换行了,就是说这一行数据我读取完成了,把这一行数据返回
if(ch=='\n'){
return sb.toString();
}else{
// 否则就拼接这个字符
sb.append((char)ch);
}
}
// 为了防止数据丢失,判断sb的长度不能大于0
if(sb.length()>0){
return sb.toString();
}
return null;
}
// 关闭方法
public void close() throws IOException{
this.r.close();
}
}