黑马程序员技术交流社区

标题: 关于自定字符流缓冲区读取异常的问题... [打印本页]

作者: 折纸时代    时间: 2013-1-31 12:25
标题: 关于自定字符流缓冲区读取异常的问题...
本帖最后由 司懿卓 于 2013-1-31 22:27 编辑

先上代码: 演示代码,直接抛出异常
  1. import java.io.*;
  2. class MyReadLine
  3. {
  4.         private FileReader r;                //定义全局读取流
  5.         MyReadLine(FileReader r)
  6.         {        
  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.                         else
  20.                                 sb.append((char)ch);        //添加到容器
  21.                 }
  22.                 if (sb.length() != 0)                        //不为空,返回一行数据
  23.                         return sb.toString();
  24.                 return null;                                        // null
  25.         }
  26.         public void myClose()        throws IOException
  27.         {
  28.                 r.close();                                //关闭流资源
  29.         }
  30. }

  31. public class MyReadLineDemo
  32. {
  33.         public static void main(String[] args) throws IOException
  34.         {
  35.                 FileReader fr = new FileReader("E:\\JavaTest\\0122\\Demo.java");
  36.                 MyReadLine myRead = new MyReadLine(fr);
  37.                 String line = null;
  38.                 /*while((line = myRead.myReadLine())!= null)
  39.                 {
  40.                         System.out.println(line);
  41.                 }*/
  42.                 while(myRead.myReadLine()!= null) // 演示
  43.                 {
  44.                         String line1 = myRead.myReadLine();
  45.                         System.out.println(line1);
  46.                 }
  47.                 myRead.myClose();
  48.         }
  49. }
复制代码
此程序是模拟BufferedReader字符流缓冲区的readLine方法的逐行读取.
注释掉的while循环为正常循环.
演示循环为异常循环.
问题: 因为,myRead.myReadLine();方法的返回值是String, 直接和null对比的.
结果输出是跳行输出的,就是隔一行输出一个. 不完整.
注释掉的循环是完整, 这是什么原因造成的呢?

完整输出结果:
abcd1
abcd2
abcd3
abcd4
哈哈 呵呵
嘿嘿 咯咯

异常输出结果:
abcd2
abcd4
嘿嘿 咯咯
-------------------------------------
这个问题不该犯啊...   
谢谢楼下几位了..  
作者: 折纸时代    时间: 2013-1-31 12:34
应该不是字符自动提升的问题.
两个循环感觉差别不大的,为什么会这样的结果?
作者: 郭嘉    时间: 2013-1-31 12:54
在你代码第43行 已经判断过一次myreadline了~~而后你再在函数中给string赋值,其实指向的是readline的下个stringbuilder,所以要改成在while循环中就判断和赋值

作者: 黑马刘向阳    时间: 2013-1-31 12:56
下面的循环执行两次readLine,第一次你用来控制循环了,只把第二次的readLine返回的输出了
作者: 陈丽莉    时间: 2013-1-31 13:10
      因为在执行while(myRead.myReadLine()!= null)时,其实已经读取一行了,但是并没有用字符串记录下读取的数据,也没有输出,所以就白读了一行,而循环体内的 String line1 = myRead.myReadLine();  System.out.println(line1);则是读了下一行并输出,所以是隔行输出的。这样写还有50%的概率会发生异常,假如while循环判断的那句是最后一行,仍可进入循环部分,那么循环体内的读行操作就发生错误了。
      还是用你注视掉的那部分吧~




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