黑马程序员技术交流社区

标题: IO流里关于读取的问题 [打印本页]

作者: Aenon    时间: 2014-3-13 22:05
标题: IO流里关于读取的问题
伪代码一:
        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();
这不是一样的吗,怎么代码一打出来的是乱码,困惑...
作者: luoanjade    时间: 2014-3-15 08:12
本帖最后由 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循环。

作者: 也许依然    时间: 2014-3-15 09:19
FileReader继承了InputStreamReader的read()方法,它返回读取的字符,如果已到达流的末尾,则返回 -1
伪代码1中,在for循环内的打印语句中又调用了一次read()方法,所以两段代码的结果是不一样的
作者: 李猛    时间: 2014-3-15 19:20
一楼说的很好,read每使用一次就会的向后读取一个字符




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2