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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

  2.         public static void main(String[] args){
  3.                 File fi = new File("Test6.java");//创建对象指向当前工程根目录的Test6.java文件
  4.                 String str = "null";//初始化文件每行的字符串
  5.                 try {
  6.                         MyFile mf = new MyFile(new FileReader(fi));//创建MyFile类对象读取fi
  7.                         mf.setLineNum(0);//初始化第一行为0
  8.                         //当每行内容不为空时加入行号和冒号
  9.                         while((str=mf.readeLine())!=null){
  10.                                 System.out.println(mf.getLineNum()+":"+str);
  11.                         }//没有文件或打开错误抛出异常
  12.                 } catch (Exception e) {
  13.                         e.printStackTrace();
  14.                 }
  15.         }       
  16. }
  17. //创建我的文件类来读取指定的文件
  18. class MyFile{
  19.         //定义行号,创建Reader来读取内容
  20.         private int lineNum;
  21.         private Reader rd;
  22.         //初始化构造函数
  23.         MyFile(Reader rd) {
  24.                 this.rd = rd;
  25.         }
  26.         public String readeLine()throws Exception{
  27.                 lineNum++;//行数叠加读取
  28.                 StringBuilder sb = new StringBuilder();//StringBuilder容器存储每行的内容
  29.                 int x=0;
  30.                 //判断该行是否有内容并存储
  31.                 while((x=rd.read())!=-1){
  32.                         if(x=='\r')
  33.                                 continue;
  34.                         if(x=='\n')
  35.                                 return sb.toString();
  36.                         sb.append((char)x);
  37.                 }
  38.                 //若sb的长度不为0则返回字符串,否则返回空
  39.                 if(sb.length()!=0)
  40.                         return sb.toString();
  41.                 return null;                       
  42.         }
  43.         //主函数设置和获取行号
  44.         public int getLineNum(){
  45.                 return lineNum;
  46.         }
  47.         public void setLineNum(int lineNum){
  48.                 this.lineNum=lineNum;
  49.         }                               
  50. }
复制代码

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马