黑马程序员技术交流社区

标题: 关于MyBufferedReaderDemo.java的疑惑 [打印本页]

作者: 小路飞    时间: 2013-3-20 19:31
标题: 关于MyBufferedReaderDemo.java的疑惑
本帖最后由 侯国奇 于 2013-3-20 23:07 编辑

上网不方便,用的手机发帖,不能复制代码,提前说声抱歉。
想问在day19天中的 MyBufferedReaderDemo.java,后来老师去掉了buf.txt文件中的最后一行回车符后,在代码中加的判断条件是怎么回事啊?就是if(sb.length()!=0)return sb.toString;这句话!
作者: michaelchen    时间: 2013-3-20 19:54
本帖最后由 michaelchen 于 2013-3-20 19:56 编辑

import java.io.*;
class MyBuffedReaderDemo
{public static void main(String[] args)throws IOException
        {FileReader fr=new FileReader("buf.txt");
         MyBufferedReader mbr=new MyBufferedReader(fr);//因为不知道要读取多少字符数据,所以我们往内存中添加数据的时候
//是需要动态添加的,这个时候想到了StringBuilder
         String line=null;
         while((line=mbr.myReadLine())!=null)
         System.out.println(line);
        }
}
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();
          sb.append((char)ch);
  }
  if(sb.length()!=0)
  return sb.toString();//在上面是根据文件结尾处是否有回车符来判断读取是否结束,如果没有回车符则无法打印
                //而实际上是缓冲区中是否有数据是根据长度是否为0来判断,所以有此句
  return null;
}
public void myClose()throws IOException
{r.close();
}
}

作者: 刘凯    时间: 2013-3-20 20:10
{StringBuilder sb=new StringBuilder();
        int ch=0;
  while((ch=r.read())!=-1)
  { if(ch=='\r')
          continue;
          if(ch=='\n')
          return sb.toString();
          sb.append((char)ch);
  }
  if(sb.length()!=0)
  return sb.toString();
  return null;

如果文件最后没有回车符,那么在读取数据的最后r.read()方法会返回-1 也就是(ch=r.read())!=-1 不再成立 循环不再执行 ,
又因为return sb.toString(); 语句再循环里边   所以必须在循环外返回已经读到sb中的数据
如果sb中没有数据的话,就返回null
如果有数据就返回其字符串形式 即sb.toString()

作者: michaelchen    时间: 2013-3-20 20:37
michaelchen 发表于 2013-3-20 19:54
import java.io.*;
class MyBuffedReaderDemo
{public static void main(String[] args)throws IOException ...

多谢版主提醒。。。:hug:
作者: VOIDMAIN    时间: 2013-3-20 22:35
        因为这是在模仿字符流BufferedReader中的readline方法,这个方法是实现每次读一行的功能,而一行的判断在windows系统中是以\r\n表示的,所以在模拟的时候可能会遇到两种情况,一种是每行后面有回车符的,还有一种特殊情况就是老师在视频中删除掉那个末尾的回车符,但是在这个回车符之前还是有一行字符,为了保证这行字符也能正常读取,就多加了一个判断条件,那就是数组中的字符长度不为0,也要把这里面的数据返回,
    理解这个问题的关键是要明白,你需要模拟的是什么功能,然后就方便理解了。




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