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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© The_king丶 中级黑马   /  2014-10-4 10:54  /  1141 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. package IO;

  2. import java.io.FileNotFoundException;
  3. import java.io.FileReader;
  4. import java.io.IOException;
  5. import java.io.LineNumberReader;

  6. class MyBufferedLineNumberReader extends LineNumberReader
  7. {
  8.         private LineNumberReader lb;
  9.        
  10.         public MyBufferedLineNumberReader(FileReader fr,LineNumberReader lb)
  11.         {
  12.                 super(fr);
  13.                 this.lb = lb;
  14.         }
  15.        
  16.         public String MyReadLine() throws IOException
  17.         {
  18.                 StringBuilder sb = new StringBuilder();
  19.                 int ch = 0;
  20.                 while((ch = lb.read())!= -1)
  21.                 {
  22.                         if(ch == '\r')
  23.                         {
  24.                                 continue;
  25.                         }
  26.                         if(ch == '\n')
  27.                         {
  28.                                 return sb.toString();
  29.                         }
  30.                         else
  31.                         {
  32.                                 sb.append((char)ch);
  33.                         }
  34.                 }
  35.                 if(sb.length()!=0)
  36.                 {
  37.                         return sb.toString();
  38.                 }
  39.                 return null;
  40.         }
  41. }
  42. public class MyBufferedLineNumberReaderDemo {
  43.   public static void main(String[] args) throws IOException {
  44.         FileReader fr = new FileReader("E:\\JAVA\\java视频\\黑马程序员JAVA基础\\19\\ReaderDemocopy.txt");
  45.         LineNumberReader lnr = new LineNumberReader(fr);
  46.         MyBufferedLineNumberReader mb = new MyBufferedLineNumberReader(fr, lnr);
  47.        
  48.        
  49.         String str = null;
  50.        
  51.         while((str = mb.MyReadLine())!= null){
  52.                 System.out.println("line:"+mb.getLineNumber()+":"+str);
  53.         }
  54.         mb.close();
  55. }
  56. }
复制代码

问题1:装饰类继承了一个没有无参构造的类,我该这样做么?还是有别的方法请不吝指教!
问题2:为什么打印出来的getLineNumber全是0?C:\Users\yy\Desktop

评分

参与人数 1技术分 +1 收起 理由
敏敏好学 + 1

查看全部评分

2 个回复

倒序浏览
首先,LineNumberReader继承自BufferedReader,已经加入了缓冲作用,为什么你还要写这么一个类呢?
装饰类的作用是增强这个体系的一些功能,让装饰类继承自体系的父类,这样这个装饰类和他的子类处于同一个层次,子类可以不用为每个子类单独创建这样增强功能的类。

再有,你使用的是你自己写的读取一行内容的方法,在LineNumberReader中,他的readLine方法在读取一行之后会将行号加1,你不使用readLine方法,行号自然不会增加。
回复 使用道具 举报
WakeUp 发表于 2014-10-4 11:17
首先,LineNumberReader继承自BufferedReader,已经加入了缓冲作用,为什么你还要写这么一个类呢?
装饰类 ...

看了API,没注意到有readLine方法,原来如此,感谢!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马