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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李志广 中级黑马   /  2012-7-18 08:41  /  2710 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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) ,我想问一下,哪一种方法更规范更合理一些呢?


9 个回复

倒序浏览
API中写道



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

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

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

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

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报

java API







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

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

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

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

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

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

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