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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李敬 中级黑马   /  2012-8-22 08:03  /  1577 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

根据毕老师视频中自定义输入流部分
自己做了些改动,无意间发现问题,百思不得其解,问题标在程序中

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;
        }
}

评分

参与人数 1技术分 +1 收起 理由
张立江 + 1 赞一个!

查看全部评分

2 个回复

倒序浏览
本帖最后由 唐杨 于 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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
张立江 + 1 赞一个!

查看全部评分

回复 使用道具 举报
楼主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行会出现问题
...
我想我分析的应该是对的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马