为什么FileInputStream在java中读取方法返回一个int,而不是short?

时间:2013-10-18 15:00:03

标签: java

我知道byte不是一个足以包含read方法结果的正确类型 因此,read方法返回int类型值 但我认为短类型比int更有效。
它可以包含范围-256~255的值 为什么read方法返回int而不是short?

5 个答案:

答案 0 :(得分:8)

Java documentation on primitive types建议使用short代替int来“节省大型数组中的内存”:

  

short short数据类型是16位带符号的二进制补码整数。它的最小值为-32,768,最大值为32,767(含)。与byte一样,适用相同的准则:在内存节省实际上很重要的情况下,您可以使用short来节省大型数组中的内存。

由于在这种情况下,内存节省实际上并不重要,使用int是一个更一致的选择。

答案 1 :(得分:2)

有几个原因:

  • 您可以轻松读取超过32 KB的数据并使用short类型,这会导致溢出
  • 由于处理器的“位数”,short的性能等于int的性能。现代CPU采用32位或64位数,适合intshort。在旧的16位处理器上运行代码时, 具有性能优势。很久以前......

答案 2 :(得分:1)

那是因为read返回读取的字节数,在InputStream中定义了以下方法:

public int read(byte[] b) throws IOException
  

从输入流中读取一些字节并将其存储到   缓冲阵列b。 实际读取的字节数返回为   整数。此方法将阻塞,直到输入数据可用,结束   检测到文件,或抛出异常。

数组的最大长度约为Integer.MAX - 5,因为您可以使用数组进行操作,然后返回类型为int。

答案 3 :(得分:1)

Read方法返回int,表示从文件读取的字节数,它是在编写API时做出的设计决定,现在让我们以相反的方式提出相同的问题:

我们可以读取多少个字节?

  

•short:短数据类型是16位带符号的二进制补码   整数。它的最小值为-32,768,最大值为   32,767(含)。您可以使用短路来节省大量内存   阵列,在内存节省真正重要的情况下。

     

•int:默认情况下,int数据类型是32位带符号的二进制数   补码整数,最小值为-231且最大值   值231-1。

假设我们将有足够的内存来保存字节,那么int可以提供更好的候选者,因此也就是API设计。然而,API决定用户根据可用资源决定要读取的字节数。

此外,read方法调用本机代码,在本机语言方面,这些原始数据类型映射到最接近的匹配本机语言数据类型。

干杯!!

答案 4 :(得分:1)

真正的原因是FileInputStream继承的抽象类也是应该在任何编码中读取字符的InputStream的基础,并且它有一个方法

public int read();

用于字符读取流以读取单个字符。

众所周知, char 是16位的无符号整数类型。

因此,无法使用 short ,因为它只有32k(或15位)正值,但我们需要64k(或16位值)字符。

我们需要(-1)表示文件结束。

与各种各样的Reader相同的故事。