我知道 byte 的类型不足以包含读取方法的结果。
因此,read 方法返回 int 类型的值。
但我认为短类型比 int 更有效。
它可以包含范围-256~255的值。
为什么read方法返回int而不是short?
5 回答
关于原始类型的 Java 文档建议short
应该使用 s 而不是int
s 来“在大数组中节省内存”:
short
:short
数据类型是一个 16 位有符号二进制补码整数。它的最小值为 -32,768,最大值为 32,767(含)。与byte
一样,适用相同的准则:在内存节省实际上很重要的情况下,您可以使用 ashort
在大型数组中节省内存。
由于在这种情况下节省内存实际上并不重要,因此使用int
是一个更一致的选择。
有几个原因:
- 您可以轻松读取超过 32 KB 的数据,并且使用
short
会导致溢出的类型 - 由于处理器的“位数”,性能
short
等于性能。现代 CPU 采用 32 位或 64 位数字,int
既适合. 在旧的 16 位处理器上运行代码有性能优势。很久以前...int
short
那是因为read返回的是读取的字节数,InputStream中定义了如下方法:
public int read(byte[] b) throws IOException
从输入流中读取一些字节并将它们存储到缓冲区数组 b. 实际读取的字节数以整数形式返回。在输入数据可用、检测到文件结尾或引发异常之前,此方法会一直阻塞。
数组的最大长度约为 Integer.MAX - 5,因为您可以对数组进行操作,所以返回类型是 int。
Read 方法返回int
表示从文件中读取的字节数,这是在编写 API 时做出的设计决定,现在让我们换个方式问同样的问题:
我们可以读取的最大字节数是多少?
•short:short 数据类型是一个16 位有符号二进制补码整数。它的最小值为 -32,768,最大值为 32,767(含)。在内存节省实际上很重要的情况下,您可以使用 short 来节省大型数组中的内存。
•int:默认情况下,int 数据类型是32 位有符号二进制补码整数,最小值为-231,最大值为231-1。
假设我们将有足够的内存来保存字节, int 是一个比 short 更好的候选者,因此是 API 设计。然而,API 将决定留给用户根据可用资源决定读取多少字节。
此外,read
方法调用本机代码,在本机语言方面,这些原始数据类型映射到最匹配的本机语言数据类型。
干杯!!
真正的原因是 FileInputStream 继承的抽象类也是 InputStreams 的基础,它应该以任何编码读取字符,并且它有一个方法
public int read();
在字符读取流中用于读取单个字符。
众所周知,char是16位的无符号整数类型。
因此,不能使用short,因为它只有 32k(或 15 位)正值,但我们需要 64k(或 16 位)的字符。
我们需要 (-1) 来表示文件结束。
Reader
各种类型的 s 都是同样的故事。