6

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

4

5 回答 5

8

关于原始类型的 Java 文档建议short应该使用 s 而不是ints 来“在大数组中节省内存”:

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

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

于 2013-10-18T15:06:19.380 回答
2

有几个原因:

  • 您可以轻松读取超过 32 KB 的数据,并且使用short会导致溢出的类型
  • 由于处理器的“位数”,性能short等于性能。现代 CPU 采用 32 位或 64 位数字,int既适合. 旧的 16 位处理器上运行代码有性能优势。很久以前...intshort
于 2013-10-18T15:08:29.233 回答
1

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

public int read(byte[] b) throws IOException

从输入流中读取一些字节并将它们存储到缓冲区数组 b. 实际读取的字节数以整数形式返回。在输入数据可用、检测到文件结尾或引发异常之前,此方法会一直阻塞。

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

于 2013-10-18T15:08:17.810 回答
1

Read 方法返回int表示从文件中读取的字节数,这是在编写 API 时做出的设计决定,现在让我们换个方式问同样的问题:

我们可以读取的最大字节数是多少?

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

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

假设我们将有足够的内存来保存字节, int 是一个比 short 更好的候选者,因此是 API 设计。然而,API 将决定留给用户根据可用资源决定读取多少字节。

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

干杯!!

于 2013-10-18T15:14:38.480 回答
1

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

public int read();

在字符读取流中用于读取单个字符。

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

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

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

Reader各种类型的 s 都是同样的故事。

于 2013-10-18T15:32:39.797 回答