黑马程序员技术交流社区

标题: helping!!!!大神求助,问题都在下面代码中。标注有很多问号的既是问题 [打印本页]

作者: 潜伏    时间: 2013-11-27 09:19
标题: helping!!!!大神求助,问题都在下面代码中。标注有很多问号的既是问题
/*
要求:模拟BufferedReader,定义一个具备同样功能的类
*/
import java.io.*;
class BufferedReaderTest
{
        public static void main(String[] args) throws IOException
        {
                FileReader fr=new FileReader("copy1.txt");//定义一个读取流并且关联一个文件copy1.txt
                MyBufferedReader mb=new MyBufferedReader(fr);
                System.out.print(mb.myReadLine());
        }
}

//定义一个具有BufferedReader具有类似readline功能的类
class MyBufferedReader
{
        private FileReader fr;
        MyBufferedReader(FileReader fr)
        {
                this.fr=fr;
        }
        StringBuffer sb=new StringBuffer();//定义一个缓冲容器StringBuffer用来存储每次读取后的数据
        public String myReadLine()throws IOException
        {
                int ch=0;
                while((ch=fr.read())!=-1)
                {
                        if(ch=='\r')//此处为什么用int型的ch去接受一个字符?????????????????????????不是错了吗????
                        {
                                continue;
                        }
                        if(ch=='\n')//每次遇到反斜杠n即返回一行。
                        {
                                return sb.toString();//此处返回的应该是append每次累计添加的所有字符啊??????????????????????
                        }
                        sb.append((char)ch);//难道每次返回过后就对sb清空了?????????????????????????????

                }
                while(sb!=null)
                {
                        return sb.toString();
                }
                return null;
        }
}

作者: 樊志伟    时间: 2013-11-27 09:59
待我新开一贴,说与你此事之蹊跷之处,稍等片刻
作者: 樊志伟    时间: 2013-11-27 10:20
楼主,你的意思是不是要从一个文件中读取数据打印到控制台?
  1. while((ch=fr.read())!=-1)
  2. {
  3.      if(ch=='\r')
  4.      {
  5.           continue;
  6.       }
  7.       if(ch=='\n')
  8.        {
  9.              return sb.toString();
  10.         }
  11.        sb.append((char)ch);
  12. }
复制代码

那你这段while循环里即直接写成
  1. while((ch=fr.read())!=-1)
  2.                         {
  3.                                 sb.append((char)ch);
  4.                         }
复制代码

不就ok?
只要不是文件结尾就一直读一直存,到了文件结尾他会自动跳出循环,最后在循环外,返回sb.toString();
即可。
作者: HAnG    时间: 2013-11-27 10:27
本帖最后由 HAnG 于 2013-11-27 10:43 编辑

1.  fr.read()返回的是int值,想获取字符要用(char)强转。
2&3.  sb是myReadLine()函数里的一个局部变量,调用完就会自动释放,每次调用这个函数时都是开辟一个新的内存空间。

作者: 帅气的冬瓜    时间: 2013-11-27 10:38
本帖最后由 帅气的冬瓜 于 2013-11-27 10:50 编辑

首先了解字码表,然后是每次读到一个字符,就存到缓冲器中。当这行读完,转换成字符串输出,重新定义对象,继续读和存

if(ch=='\r')//此处为什么用int型的ch去接受一个字符      '\r'在字码表中对应一个十六进制的数,所以是整形的,因此没有错的!
                        {
                                continue;
                        }
                        if(ch=='\n')//每次遇到反斜杠n即返回一行。
                        {
                                return sb.toString();//此处返回的应该是append每次累计添加的所有字符啊       这行读完,把这行转换成字符串输出。
                        }
                        sb.append((char)ch);//难道每次返回过后就对sb清空了            如果这行没有遇到'\r'和'\n',每读到一个字符就存到缓冲器中.上面有重新定义对象【   StringBuffer sb=new StringBuffer();】
如果不明白还可以再问的。


作者: 潜伏    时间: 2013-11-27 13:56
HAnG 发表于 2013-11-27 10:27
1.  fr.read()返回的是int值,想获取字符要用(char)强转。
2&3.  sb是myReadLine()函数里的一个局部变量, ...

是啊,不过只调用了一次,也不清空
作者: 潜伏    时间: 2013-11-27 13:58
帅气的冬瓜 发表于 2013-11-27 10:38
首先了解字码表,然后是每次读到一个字符,就存到缓冲器中。当这行读完,转换成字符串输出,重新定义对象, ...

上面是重新new bufferedreader ,又不是在myreadline里面new的???
作者: 潜伏    时间: 2013-11-27 13:59
樊志伟 发表于 2013-11-27 10:20
楼主,你的意思是不是要从一个文件中读取数据打印到控制台?

那你这段while循环里即直接写成

你没懂我意思啊
作者: HAnG    时间: 2013-11-27 14:02
潜伏 发表于 2013-11-27 13:56
是啊,不过只调用了一次,也不清空

不用清空,因为函数调用完,sb在内存中就不存在了,再次调用时用的sb是新的缓冲区对象。




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