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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈洋 中级黑马   /  2013-8-11 11:48  /  1534 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 陈洋 于 2013-8-12 00:15 编辑

import java.io.*;
class MyBufferedReader
{
        private FileReader r;
        MyBufferedReader(FileReader r)
        {
                this.r = r;
        }
        public String myReadLine()throws IOException
        {
                StringBuilder sb = new StringBuilder();
                int ch = 0;
                while((ch=r.read())!=-1)
                {
                        if(ch=='\r')
                                continue;
                        if(ch=='\n')
                                return sb.toString();//大神请看这里
                                        //为什么没有将StringBuilder清空,返回到下面调用处,打印没有将之前的值打印出来
                                        //我写了个StringBuilder存数据,打印的都会把前面添加和后面添加一起打印出来,
                                        //也就是讲StringBuilder容器中的所有内容都打印出来,求解释:
                        else
                                sb.append((char)ch);
                }
                if(sb.length()!=0)
                        return sb.toString();
                return null;               
        }
        public void myClose()throws IOException
        {
                r.close();
        }
}
class  MyBufferedReaderDemo
{
        public static void main(String[] args) throws IOException
        {
                FileReader fr = new FileReader("buf.txt");
                MyBufferedReader myBuf = new MyBufferedReader(fr);
                String line = null;
                while((line=myBuf.myReadLine())!=null)
                {
                        System.out.println(line);
                }
                myBuf.myClose();
        }
}

评分

参与人数 1技术分 +1 收起 理由
以防万一 + 1 赞一个!

查看全部评分

6 个回复

倒序浏览
看我给你改的
  1. package tom1;

  2. import java.io.FileReader;
  3. import java.io.IOException;

  4. class MyBufferedReader {
  5.         private FileReader r;

  6.         MyBufferedReader(FileReader r) {
  7.                 this.r = r;
  8.         }

  9.         public String myReadLine()throws IOException
  10.         {
  11.                 StringBuilder sb = new StringBuilder();
  12.                 int ch = 0;
  13.                 while((ch=r.read())!=-1)
  14.                 {
  15.                         if(ch=='\r')
  16.                                 continue;
  17.                         if(ch=='\n')
  18.                                 return sb.toString();//大神请看这里
  19.                                         //为什么没有将StringBuilder清空,返回到下面调用处,打印没有将之前的值打印出来
  20.                                         //我写了个StringBuilder存数据,打印的都会把前面添加和后面添加一起打印出来,
  21.                                         //也就是讲StringBuilder容器中的所有内容都打印出来,求解释:
  22.                         else
  23.                                 sb.append((char)ch);
  24. //                        if(sb.length()!=0)
  25. //                            return sb.toString();
  26. //                    return null;         
  27. //                我把这里的给移到下面去了,你返回语句应该写到while循环的外面呀!!!!
  28.                
  29.                 }
  30.                 if(sb.length()!=0)
  31.                     return sb.toString();
  32.                 else
  33.                         return null;
  34.                
  35.         }

  36.         public void myClose() throws IOException {
  37.                 r.close();
  38.         }
  39. }
  40.        
复制代码

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报

不好意思,代码发的时候,删除注释删除多了,本来就是在while循环外面的。
还是之前的问题,没有清除Stringbuilder容器,下面为什么没有把之前添加的内容也打印出来。:'(不明白
import java.io.*;
class MyBufferedReader extends Reader
{
        private Reader r;
        MyBufferedReader(Reader r)
        {
                this.r = r;
        }
        public String myReadLine()throws IOException
        {
                StringBuilder sb = new StringBuilder();
                int ch = 0;
                while((ch=r.read())!=-1)
                {
                        if(ch=='\r')
                                continue;
                        if(ch=='\n')
                                return sb.toString();//大神请看这里
                               //为什么没有将StringBuilder清空,返回到下面调用处,打印没有将之前的值打印出来
                              //我写了个StringBuilder存数据,打印的都会把前面添加和后面添加一起打印出来,
                             //也就是讲StringBuilder容器中的所有内容都打印出来,求解释:
                        else
                                sb.append((char)ch);
                }
                if(sb.length()!=0)
                        return sb.toString();
                return null;               
        }
        public int read(char[] cbuf, int off, int len) throws IOException
        {
                return r.read(cbuf,off,len) ;
        }

        public void close()throws IOException
        {
                r.close();
        }
        public void myClose()throws IOException
        {
                r.close();
        }
}
class  MyBufferedReaderDemo
{
        public static void main(String[] args) throws IOException
        {
                FileReader fr = new FileReader("buf.txt");
                MyBufferedReader myBuf = new MyBufferedReader(fr);
                String line = null;
                while((line=myBuf.myReadLine())!=null)
                {
                        System.out.println(line);
                }
                myBuf.myClose();
        }
}
回复 使用道具 举报
陈洋 发表于 2013-8-11 16:32
不好意思,代码发的时候,删除注释删除多了,本来就是在while循环外面的。
还是之前的问题,没有清除Stri ...

因为上面添加了好几行的数据,但是下面打印问什么是一行一行的数据。
我认为第一次容器中只有一行数据,所以返回字符串打印后是一行,但是第二次容器里面有2行了,返回也应该是2行数据,问什么打印的时候只打印出来第二行,第一行的数据没有打印出来,这个容器也应该没有自动清除的功能吧。:Q
回复 使用道具 举报
陈洋 发表于 2013-8-11 16:37
因为上面添加了好几行的数据,但是下面打印问什么是一行一行的数据。
我认为第一次容器中只有一行数据, ...

我运行以后返回的是文件中的所有内容啊 !!
没有什么问题 呀。

评分

参与人数 1黑马币 +1 收起 理由
陈洋 + 1 赞一个!

查看全部评分

回复 使用道具 举报
小发 发表于 2013-8-11 23:16
我运行以后返回的是文件中的所有内容啊 !!
没有什么问题 呀。

我知道是文件中的全部内容,但是为什么没有重复的,就是容器的内容肯定是越来越多的,又是循环返回,肯定下一次的内容多于上一次,但是这个程序打印竟然没有重复的,我不清楚,我自己写的程序打印的有重复,大神解释。
回复 使用道具 举报
陈洋 中级黑马 2013-8-12 00:13:50
7#
非常感谢小发大神的热心解答,虽然没有看明白我的不解之处,但是我想明白了,因为每次调用都要重新创建一个StringBuilder容器,作用和清除容器一样,所以每次容器都是空的,不会有之前的数据在里面。{:soso_e130:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马