黑马程序员技术交流社区
标题:
关于自定字符流缓冲区读取异常的问题...
[打印本页]
作者:
折纸时代
时间:
2013-1-31 12:25
标题:
关于自定字符流缓冲区读取异常的问题...
本帖最后由 司懿卓 于 2013-1-31 22:27 编辑
先上代码: 演示代码,直接抛出异常
import java.io.*;
class MyReadLine
{
private FileReader r; //定义全局读取流
MyReadLine(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();
else
sb.append((char)ch); //添加到容器
}
if (sb.length() != 0) //不为空,返回一行数据
return sb.toString();
return null; // null
}
public void myClose() throws IOException
{
r.close(); //关闭流资源
}
}
public class MyReadLineDemo
{
public static void main(String[] args) throws IOException
{
FileReader fr = new FileReader("E:\\JavaTest\\0122\\Demo.java");
MyReadLine myRead = new MyReadLine(fr);
String line = null;
/*while((line = myRead.myReadLine())!= null)
{
System.out.println(line);
}*/
while(myRead.myReadLine()!= null) // 演示
{
String line1 = myRead.myReadLine();
System.out.println(line1);
}
myRead.myClose();
}
}
复制代码
此程序是模拟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