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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小路飞 中级黑马   /  2013-3-20 19:31  /  1498 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 侯国奇 于 2013-3-20 23:07 编辑

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

点评

如果问题未解决,请继续追问回复者,如果问题已经解决,请将分类改为“已解决”,谢谢  发表于 2013-3-20 22:24

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

4 个回复

正序浏览
        因为这是在模仿字符流BufferedReader中的readline方法,这个方法是实现每次读一行的功能,而一行的判断在windows系统中是以\r\n表示的,所以在模拟的时候可能会遇到两种情况,一种是每行后面有回车符的,还有一种特殊情况就是老师在视频中删除掉那个末尾的回车符,但是在这个回车符之前还是有一行字符,为了保证这行字符也能正常读取,就多加了一个判断条件,那就是数组中的字符长度不为0,也要把这里面的数据返回,
    理解这个问题的关键是要明白,你需要模拟的是什么功能,然后就方便理解了。
回复 使用道具 举报
michaelchen 发表于 2013-3-20 19:54
import java.io.*;
class MyBuffedReaderDemo
{public static void main(String[] args)throws IOException ...

多谢版主提醒。。。:hug:
回复 使用道具 举报
{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 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:09

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马