黑马程序员技术交流社区

标题: 问一个关于装饰类的问题 [打印本页]

作者: Jacky_Chen1990    时间: 2013-5-4 13:07
标题: 问一个关于装饰类的问题
本帖最后由 Jacky_Chen1990 于 2013-5-4 13:09 编辑

先看一下代码如下:
  1. package com.itheima;

  2. import java.io.*;

  3. public class MyBufferedReaderDemo {
  4.         public static void main(String[] args) throws IOException {
  5.                 FileReader fr = new FileReader("abc.txt");
  6.                
  7.                 MyBufferedReader mbr = new MyBufferedReader(fr);
  8.                 String line = null;
  9.                 while((line=mbr.myReadLine())!=null){
  10.                         System.out.println(line);
  11.                 }
  12. //                StringBuilder sb = new StringBuilder();
  13. //               
  14. //                sb.append(true);
  15. //                System.out.println(sb.toString());
  16. //                sb.append("adfadf");
  17. //                System.out.println(sb.toString());
  18.                
  19.         }
  20. }

  21. class MyBufferedReader extends Reader {
  22.         
  23.         private FileReader fr = null;
  24.         
  25.         public MyBufferedReader(FileReader fr){
  26.                 this.fr = fr;
  27.         }
  28.         
  29.         public String myReadLine() throws IOException {
  30.                
  31.                 //定义一个临时容器。原BufferedReader封装的是字符数组
  32.                 //为了演示方便,定义一个StringBuilder容器。因为最终还是要将数据变成字符串
  33.                 StringBuilder sb = new StringBuilder();
  34.                 //sb是累计的加入各种字符,但是在调用时是用while循环,所以似乎读一行,去一行,又从新建立了StringBuilder。
  35.                 int ch = 0;
  36.                
  37.                 //当读到-1的时候表示已经读到结尾
  38.                 while((ch=fr.read())!=-1) {
  39.                         //两个if用来在读写达到换行时进行处理
  40.                         if(ch=='\r')
  41.                                 continue;
  42.                         if(ch=='\n')
  43.                                 return sb.toString();
  44.                         else
  45.                                 sb.append((char)ch);
  46.                 }
  47.                
  48.                 //到达文件的结尾,判断是否需要输出最后一行。
  49.                 if(sb.length()!=0)
  50.                         return sb.toString();
  51.                 //已经到达文件结尾
  52.                 return null;
  53.         }
  54.         
  55.         public void myClose() throws IOException {
  56.                 fr.close();
  57.         }

  58.         @Override
  59.         public int read(char[] cbuf, int off, int len) throws IOException {
  60.                 // TODO Auto-generated method stub
  61.                 return fr.read(cbuf,off,len);
  62.         }

  63.         @Override
  64.         public void close() throws IOException {
  65.                 // TODO Auto-generated method stub
  66.                 fr.close();
  67.         }
  68. }
复制代码
里面自己定义的MyBufferedReader继承了Reader,并且实现了Reader类中的抽象方法

我想问的就是这个自定义装饰类必须要继承这个Reader么,不是非常的理解。还望解释下,谢谢!
作者: Jacky_Chen1990    时间: 2013-5-4 13:16
尹桥印 发表于 2013-5-4 13:13
先回帖!

被你赚了。。。。:lol
作者: Jacky_Chen1990    时间: 2013-5-4 14:02
尹桥印 发表于 2013-5-4 13:22
金币当然要赚的呐~~~

木有人回答。。。我顶。:lol
作者: Jacky_Chen1990    时间: 2013-5-4 16:36
求解释。。求懂这个的人分享下知识点吧!
作者: 刘学明       时间: 2013-5-4 23:19
{:soso_e154:}有分我也来赚啊 哈哈
作者: pzw370784    时间: 2013-5-4 23:33
回帖,赚金币
作者: kaka小明    时间: 2013-5-5 16:34
不用必须继承Read,装饰类是将已有对象的某些方法进行加强,和继承没有必然的依存关系。LZ例子是为了使用FileReader fr对象的read方法,而实现myReadline方法,就是将已有对象的read(一次读一个字符)方法升级为myreadline方法(读取一整行的有效字符).
作者: Jacky_Chen1990    时间: 2013-5-5 17:26
kaka小明 发表于 2013-5-5 16:34
不用必须继承Read,装饰类是将已有对象的某些方法进行加强,和继承没有必然的依存关系。LZ例子是为了使用Fi ...

恩 谢谢你哈。这么说我就明白了很多。我是版主的话就给你加分了!感谢!
作者: 黄玉昆    时间: 2013-5-5 22:44
如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2