【问题标题】:Why does the read() in FileInputStream return an integer? [duplicate]为什么 FileInputStream 中的 read() 返回一个整数? [复制]
【发布时间】:2012-04-08 05:19:56
【问题描述】:

This 页面显示是这样,当它想指示没有更多字节要读取时,该方法可以返回 -1。

但是一个字节的范围是 -128 到 127,对吧?而且 read() 的返回类型是字节不是更有意义吗,因为它返回一个字节?

感谢您的宝贵时间。

【问题讨论】:

    标签: java byte fileinputstream


    【解决方案1】:

    它返回值作为int 的原因是它需要返回一个介于 0-255 之间的值,并且能够指示何时没有更多字节可从文件中读取。通过使用 int,您可以返回 0-255 的全部正无符号值,并指示文件何时完成。它不能只提供 byte 值的 256 个不同值,Java 默认情况下其中一半是负数。

    【讨论】:

      【解决方案2】:

      当然,但是JavaDocs 继续说..

      返回:
      读入缓冲区的总字节数,如果没有更多数据,则返回 -1,因为已到达文件末尾。

      希望一次可以从流中读取超过 127 个字节。

      【讨论】:

      • 我一开始也犯了这个错误——read() 方法实际上返回的是单个字节的数据,而不是可以读取的字节数。 docs.oracle.com/javase/7/docs/api/java/io/…
      • @Andrew Thompson 我认为您阅读了错误方法的文档。您阅读了 public int read(byte[] b) 的内容,我指的是 public int read()
      • 有几种不同的read() 方法。一个返回单个字节;其他人填充一个数组并返回已读取的 number 个字节。
      • 我指的是不需要任何参数的方法。因为这也是我指向的链接中给出的示例中使用的方法。
      【解决方案3】:

      一个字节的数据是一个无符号值,范围从0255,而java中的byte定义为从-128127,这在以下情况下没有意义读取二进制数据。 read() 返回一个整数,允许它使用所有非负值表示有效数据,并返回一个负值表示数据结束。

      一般来说,一个函数应该使用一种不同于它用来返回数据的机制来指示错误条件或异常。在最简单的情况下,它可以返回一个不能用来表示有效数据的值,以确保其含义明确。

      【讨论】:

        【解决方案4】:

        问:read() 的返回类型是否更有意义? 字节?

        A:不,因为“byte”不能返回整个范围 0..255(无符号),而“short”只是一个 PITA。

        【讨论】:

        • 好的。我在想也许通过使用内部位级操作,数据可以以签名格式本身存储。那很愚蠢,但是,我现在明白了。无论如何,我很想知道为什么 PITA 很短?
        • PITA == "臀大肌疼痛" ;)
        • 只是因为 Java 中的数字默认为 int 值,所以如果它是 short,您需要进行从 shortint 的转换,即使转换已处理由 Java 引擎自动生成
        【解决方案5】:

        FileInputStream 类可以将文件内容作为字节流读取。这是一个简单的例子:

        InputStream input = new FileInputStream("c:\\data\\input-text.txt");
        
        int data = input.read();
        while(data != -1) {
          //do something with data...
          doSomethingWithData(data);
        
          data = input.read();
        }
        input.close();
        

        注意:为清楚起见,此处已跳过正确的异常处理。要了解有关正确异常处理的更多信息,请转到 Java IO 异常处理。

        FileInputStream 的 read() 方法返回一个 int,其中包含所读取字节的字节值。如果 read() 方法返回 -1,则流中没有更多数据要读取,可以将其关闭。也就是说,-1 作为 int 值,而不是 -1 作为字节值。这里有区别!

        【讨论】:

        • -1 因为“即 -1 作为 int 值,而不是 -1 作为 byte 值。这里有区别!”。 ( (byte) -1 ) == ( (int) -1 )的评价是什么?当然是true,因为字节是从-128到127,这意味着-1也是合法的字节值。
        猜你喜欢
        • 2012-03-14
        • 1970-01-01
        • 2011-04-10
        • 1970-01-01
        • 1970-01-01
        • 2013-02-27
        • 1970-01-01
        • 1970-01-01
        • 2014-04-22
        相关资源
        最近更新 更多