自定义字符输入流的包装类,通过这个包装类对底层字符输入流进行包装,让程序通过这个包装类读取某个文本文件(例如,一个java源文件)时,能够在读取的每行前面都加上有行号和冒号。

来源:互联网 发布:手机淘宝排行榜模版 编辑:程序博客网 时间:2024/05/21 02:48

自定义字符输入流的包装类,通过这个包装类对底层字符输入流进行包装,让程序通过这个包装类读取某个文本文件(例如,一个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的长度不能大于0if(sb.length()>0){return sb.toString();}return null;}//关闭方法public void close() throws IOException{this.r.close();}}


0 0