为什么Java中的FileInputStream读取方法返回int而不是short?

6

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


6
没人真正使用“short”... - arshajii
3
在什么情况下?对于一个方法调用,在值存储在本地变量之后(可能最终会成为寄存器),我会惊讶地看到任何显着的差异。但如果是短类型,可能比整型更有效率。 - Jon Skeet
1
@crazy_rudy 实际上,在 Oracle JVM 中,short 内部与 int 表示方式相同(在其他 VM 中可能更有效,因为它是实现相关的,但在实践中,shortint 总是相同的)。唯一应考虑使用 short 的地方是在创建大型 short[] 数组时。在这种情况下,VM 通常内部使用真正的两字节短整型而不是 int(这会节省空间)。 - Petr Janeček
还要注意,File、FileInputStream等是遗留的API。如果可能的话,建议使用新的NIO.2 File API。 - Puce
1
@Puce 在你的引用中,“File”类被称为“遗留”,而不是整个java.io包。 - user207421
显示剩余10条评论
5个回答

8

Java原始类型文档建议使用short而不是int来“在大数组中节省内存”:

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

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


8
JVM使用32位“槽”作为byte、char、short和int的返回值。 - Peter Lawrey

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

1
由于楼主提到了值范围,他显然是在询问另一个read() - Sergey Kalinichenko
@dasblinkenlight 同意,但是原帖的作者应该自己澄清。 - user207421

1
由于read返回读取的字节数,因此InputStream中定义了以下方法:
public int read(byte[] b) throws IOException

从输入流中读取一些字节并将它们存储到缓冲区数组b中。实际读取的字节数作为整数返回。此方法会阻塞,直到有可用的输入数据、检测到文件结束或抛出异常为止。
由于可以对数组执行操作,因此数组的最大长度约为Integer.MAX - 5,因此返回类型为int。

由于OP谈到了值范围,他显然是在询问另一个read() - Sergey Kalinichenko
@dasblinkenlight 但只要您可以从数组中读取数据,且该数组可以容纳整数大小的数据,就不可能返回一个short类型的值。 - Alfredo Osorio
1
但这在这里是无关紧要的,因为他谈论的是一个不带参数的“读取”,并返回一个单独的“字节”作为“int”。OP想知道为什么它不是一个“short”,因为该字节同样适合于“short”,并且还提供了“EOF”的“-1”。 - Sergey Kalinichenko

1
真正的原因是FileInputStream继承的抽象类也是用于读取任何编码字符的InputStreams的基类,并且它有一个方法。
public int read();

用于读取单个字符的字符读取流。
众所周知,char是一个16位无符号整数类型。
因此,不能使用 short,因为它只有32k(或15位)正值,但我们需要64k(或16位)来表示字符。
我们需要使用(-1)来表示文件结束。
所有类型的Reader都有相同的情况。

继承确实是根本原因,但方法只需要返回一个“byte”或一个标记,而不是一个“char”和一个标记,因此来自“char”的参数不适用。它适用于读取器。 - user207421

1

读取方法返回 int,表示从文件中读取的字节数,这是编写API时做出的设计决策,现在让我们换一种方式提问:

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

•short:short数据类型是一个16位有符号的二进制补码整数。它的最小值为-32,768,最大值为32,767(包括)。您可以在需要实际节省内存的大型数组中使用short以节省内存。

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

假设我们将有足够的内存来保存字节,则int比short更适合作为API设计的候选。但是API将决定权留给用户,根据可用资源决定要读取多少字节。

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

干杯!!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接