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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Aenon 中级黑马   /  2014-3-13 22:05  /  1209 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

伪代码一:
        FileReader fr = new FileReader("IOdemo.java");
        for(;fr.read()!=-1;)
        System.out.print((char)fr.read());
        fr.close();
伪代码二:
        FileReader fr = new FileReader("IOdemo.java");
        int ch = 0;
        for(;(ch=fr.read())!=-1;)
        System.out.print((char)ch);
        fr.close();
这不是一样的吗,怎么代码一打出来的是乱码,困惑...

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

3 个回复

倒序浏览
本帖最后由 luoanjade 于 2014-3-15 08:14 编辑

首先,你上面两种写法是不一样的。代码一错,代码二对。
伪代码一:
        FileReader fr = new FileReader("IOdemo.java");
        for(;fr.read()!=-1;) //这次读取仅用于判断,后面的打印并非是它
        System.out.print((char)fr.read()); //又读了一次,这次读取是在你for循环里面读完后的基础上。这次读出的结果被打印出来了
        fr.close();
给你个例子:
文件中存有这样的数据:abcdefg
代码一打出来的结果是:bdf?   (因为for里面的最后一次读取是g,然而他并不等于-1,所以for循环没有停,到循环里面再读一次,结果就读到了末尾了,打出来的这个问号应该就是文件末尾的标志-1。)
使用你的代码一来分析一下:
         for(;fr.read()!=-1;) //在这里读到的是:a,c,e,g,-1(读到这里结束)
                  System.out.print((char)fr.read()); //这里读到的是:b,d,f,-1(读到这里也是末尾,但并没有结束,被打印出来了)

还有,楼主为何不使用while呢,非要写这么别扭的for循环。

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
FileReader继承了InputStreamReader的read()方法,它返回读取的字符,如果已到达流的末尾,则返回 -1
伪代码1中,在for循环内的打印语句中又调用了一次read()方法,所以两段代码的结果是不一样的
回复 使用道具 举报
一楼说的很好,read每使用一次就会的向后读取一个字符
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马