黑马程序员技术交流社区
标题:
IO流中的问题
[打印本页]
作者:
李敬
时间:
2012-8-22 08:03
标题:
IO流中的问题
根据毕老师视频中自定义输入流部分
自己做了些改动,无意间发现问题,百思不得其解,问题标在程序中
import java.io.File;
import java.io.FileReader;
import java.io.Reader;
public class Demo {
public static void main(String[] args) throws Exception{
File file = new File("src/Demo.java");
MyReader mr = new MyReader(new FileReader(file));
String len = null;
while ((len = mr.myreadLine()) != null) {
System.out.println(len);
}
}
}
class MyReader {
private Reader r;
private int count;
public MyReader(Reader r) {
this.r = r;
count = 0;
}
public String myreadLine() throws Exception {
StringBuilder sb = new StringBuilder();
++count;
sb.append(count+": ");
//这里只添加了3个数据
int ch = -1;
while ((ch = r.read()) != -1) {
if (ch == '\r') {
continue;
}
else if (ch == '\n') {
return sb.toString();
}
sb.append((char) ch);
}
if (sb.length() > 4) {
//这里搞不懂为什么要大于4呢,如果写大于3的话,程序就会一直打印数字和": "
return sb.toString();
}
return null;
}
}
作者:
唐杨老师
时间:
2012-8-22 09:12
本帖最后由 唐杨 于 2012-8-22 09:16 编辑
这里你挺细心的,问题的关键其实在于
count
StringBuilder在存储count (int类型的)时候
如果 count的值在0-100之间认为是添加了一个 数据
>100则认为是2个
>1000认为是3个
所以,当sb.length() > 4时候,只能保证文件内容在100行以内的数据输出 没问题,
超过一百行,前边就要改成 >5 .
超过一千行,前边就要改成 >6
用这个代码楼主可以试一下
public class CopyOfDemo {
public static void main(String[] args) throws Exception{
StringBuilder sb = new StringBuilder();
int count = 1000; //在这里尝试1-100,100,1000,10000 ,输出结果,你就明白了
sb.append(count+": ");//这里并非只添加了3个数据 ,而是会虽count曾大而变大.
System.out.println(sb.length());
}
}
复制代码
作者:
王少岩
时间:
2012-8-22 11:38
楼主if (sb.length() > 4) 这部分代码的功能应该是打印末尾不带回车的那一行数据吧,
如果sb.length() > 3,打印8行数据没问题,打印9行就会出现楼主所说的现象,当打印完第9行时,再次进入myreadLine方法,count变为10,这时sb.length()==4,满足了sb.length() > 3,所以会执行return sb.toString(),while中的条件len = mr.myreadLine()) != null,满足条件,继续执行myreadLine,count继续变为11,12,13...,总之肯定是sb.length() > 3,永远执行不到return null,及永远符合while中的条件len = mr.myreadLine()) != null,所以会出现楼主所说的那个现象。
以此类推,
sb.length() > 4时,打印99行会出现问题
sb.length() > 5时,打印999行会出现问题
...
我想我分析的应该是对的
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2