黑马程序员技术交流社区

标题: 菜鸟:IO流 [打印本页]

作者: 李志广    时间: 2012-7-18 08:41
标题: 菜鸟:IO流
本帖最后由 007lzg 于 2012-7-18 14:47 编辑

import java.io.*;
class  FileReaderTest
{
        public static void main(String[] args) throws IOException
        {
                FileReader fr=null;
                try
                {
                        fr=new FileReader("FileDemo.java");
                        char[] buf=new char[1024];
                        int hasRead=0;
                        while((hasRead=fr.read(buf))>0)
                                {
                                System.out.println(new String(buf,0,hasRead));
                                }

                }
                catch (IOException ioe)
                {
                        ioe.printStackTrace();
                }
                finally
                        {
                        if(fr!=null)
                                {
                                fr.close();
                                }
                        }
        }
}

毕老师在讲课的时候总是while((hasRead=fr.read(buf))!=-1) ,而在一些书籍上看到while((hasRead=fr.read(buf))>0) ,我想问一下,哪一种方法更规范更合理一些呢?



作者: 康大玮    时间: 2012-7-18 09:05
API中写道



public int read(char[] cbuf)
         throws IOException将字符读入数组。在某个输入可用、发生 I/O 错误或者已到达流的末尾前,此方法一直阻塞。

参数:
cbuf - 目标缓冲区
返回:
读取的字符数,如果已到达流的末尾,则返回 -1
抛出:
IOException - 如果发生 I/O 错误

我感觉毕老师的更规范
作者: 田建    时间: 2012-7-18 09:23
其实我觉得是一样的,里面的内容只是作为一个判断的条件,当读到末尾的时候就返回-1,因而用!=-1做判断就说明没达到末尾,可以继续读;而>0也能达到同样的效果,只要>0就说明读取到了内容,因而我认为这是没有差别的,皆可!
作者: 马林康    时间: 2012-7-18 09:25
两个基本没差别吧
作者: 黑马-王言龙    时间: 2012-7-18 10:21
本帖最后由 黑马-王言龙 于 2012-7-18 10:28 编辑

说规范当然是毕老师的
API文档里就是这么写的:返回:读取的字符数,如果已到达流的末尾,则返回 -1
那如果有没有到达流的末尾,返回的就不是-1,所以才有while((hasRead=fr.read(buf))!=-1),没到结尾就循环。
hasRead=fr.read(buf))>0也没问题,(=-1)的时候,也会结束循环,不是太规范(API是最权威资料)
作者: 陈少文    时间: 2012-7-18 10:40

java API







while((hasRead=fr.read(buf))!=-1)
意思是:读取的符数,只要不到末尾,我继续读
因为到末尾,将返回-1

while((hasRead=fr.read(buf))>0)

意思是:读取字符数,只要返回的值大于0,也就是不是-1
我继续读。

">0"范围包括很多值    "!=-1"的范围只有一个值。
个人感觉用>0,不严谨,跟java API,有一些出入。
虽然在这里,表示的意思是一样的

建议,跟这API走,用 "!=-1"


作者: 程潇    时间: 2012-7-18 10:42
用!=-1更规范些,效率也高一些
作者: 柯玲    时间: 2012-7-18 10:51
首先要想为什么要用while((hasRead=fr.read(buf))!=-1)作判断,这个-1是怎么来的?
这是因为在每一个文件的结尾处都有一个windows指定的结束标示,当Windows读到数据末尾返回结束标示给java,而java根据这个结束标示返回-1,表明数据已读到结尾。
所以-1是根据java虚拟机对Windows结束标示符返回的一个表示值。
所以两种写法都对,只不过while((hasRead=fr.read(buf))!=-1)把JVM底层是怎么工作的也反映出来了。
作者: 黄丽慧    时间: 2012-7-18 11:36
这个跟read方法读取内存上数据的方式有关,当读完所有的数据时,指标就会变成-1.因此,像毕老师这样的写法是比较合理的,才不会造成漏读的情况。
作者: 李志广    时间: 2012-7-18 14:47
呵呵,谢谢各位的讲解!




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