黑马程序员技术交流社区

标题: 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

用这个代码楼主可以试一下
  1. public class CopyOfDemo {

  2.         public static void main(String[] args) throws Exception{
  3.             StringBuilder sb = new StringBuilder();
  4.             int count = 1000;  //在这里尝试1-100,100,1000,10000  ,输出结果,你就明白了
  5.             sb.append(count+": ");//这里并非只添加了3个数据 ,而是会虽count曾大而变大.
  6.             System.out.println(sb.length());
  7.         }
  8. }
复制代码

作者: 王少岩    时间: 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