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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Jacky_Chen1990 高级黑马   /  2013-5-4 13:07  /  2390 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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么,不是非常的理解。还望解释下,谢谢!

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1

查看全部评分

12 个回复

正序浏览
如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢
回复 使用道具 举报
kaka小明 发表于 2013-5-5 16:34
不用必须继承Read,装饰类是将已有对象的某些方法进行加强,和继承没有必然的依存关系。LZ例子是为了使用Fi ...

恩 谢谢你哈。这么说我就明白了很多。我是版主的话就给你加分了!感谢!
回复 使用道具 举报
不用必须继承Read,装饰类是将已有对象的某些方法进行加强,和继承没有必然的依存关系。LZ例子是为了使用FileReader fr对象的read方法,而实现myReadline方法,就是将已有对象的read(一次读一个字符)方法升级为myreadline方法(读取一整行的有效字符).

评分

参与人数 2技术分 +1 黑马币 +20 收起 理由
黄玉昆 + 1
Jacky_Chen1990 + 20 赞一个!

查看全部评分

回复 使用道具 举报
应该可以不用继承,但一些Reader方法就需要自己写了。
回复 使用道具 举报

回帖奖励 +5

回帖,赚金币
回复 使用道具 举报

回帖奖励 +5

{:soso_e154:}有分我也来赚啊 哈哈
回复 使用道具 举报
求解释。。求懂这个的人分享下知识点吧!
回复 使用道具 举报
尹桥印 发表于 2013-5-4 13:22
金币当然要赚的呐~~~

木有人回答。。。我顶。:lol
回复 使用道具 举报
尹桥印 发表于 2013-5-4 13:13
先回帖!

被你赚了。。。。:lol
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马