A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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


不知道大家有没有更好的方法做这个题目。
  1. package com.hkddy8.test1;

  2. import java.io.File;
  3. import java.io.FileReader;
  4. import java.io.IOException;
  5. import java.io.Reader;

  6. /*
  7. * 1: 自定义字符输入流的包装类,通过这个包装类对底层字符输入流进行包装, 让程序通过这个包装类读取某个文本文件(例如,一个java源文件)时,
  8. *
  9. * 能够在读取的每行前面都加上有行号和冒号。
  10. *
  11. */
  12. public class Test1 {

  13.         public static void main(String[] args) throws IOException {

  14.                 File file = new File("Test1.java");
  15.                 MyLineNumberReader m = new MyLineNumberReader(new FileReader(file));
  16.                 String line = null;
  17.                 while((line=m.readLine())!=null){
  18.                         System.out.println(line);
  19.                 }
  20.                 m.close();
  21.         }
  22. }


  23. class MyLineNumberReader{       
  24.        
  25.         private Reader read;
  26.        
  27.         private int lineNumber;
  28.        
  29.         MyLineNumberReader(Reader read){
  30.                 this.read = read;
  31.         }
  32.        
  33.        
  34.         public String readLine() throws IOException{
  35.                
  36.                 StringBuffer sb = new StringBuffer();
  37.                 int num = 0;
  38.                 // 调用底层输入流读取
  39.                 while((num=read.read())!=-1){
  40.                         // 判断换行符
  41.                         if(num=='\r'){
  42.                                 continue;
  43.                         }else if(num=='\n')        {
  44.                                 // 如果换行 则行号++
  45.                                 lineNumber++;
  46.                                 // 返回 加行号后的数据
  47.                                 return addLineNumber(sb.toString());
  48.                         }else{
  49.                                 // 如果没有判断到换行就一直追加数据
  50.                                 sb.append((char)num);
  51.                         }
  52.                 }
  53.                 // 读取最后一行,因为最后一行可能不满
  54.                 if(sb.length()>0){
  55.                         return ++lineNumber+": "+sb.toString();
  56.                 }
  57.                
  58.                 return null;
  59.         }

  60.         // 加入行号方法
  61.         private String addLineNumber(String string) {
  62.                 return lineNumber+": "+string;
  63.         }
  64.        
  65.         // 关闭资源方法
  66.         public void close() throws IOException{
  67.                 read.close();
  68.         }
  69. }
复制代码




1 个回复

倒序浏览
也是这么写的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马