为什么InputStream#read()
返回一个int
而不是一个byte
?
byte
只能存储-128到127的值,而它应该返回0到255(当没有字节剩余时,即EOF时返回-1)。 即使它返回了byte
,也没有空间来表示EOF。short
。返回一个int,因为当流无法再读取时,它会返回-1。
如果返回一个byte,则不能返回-1以指示缺少输入,因为-1是一个有效的byte。此外,您不能返回大于127或小于-128的值,因为Java只处理有符号byte。
许多时候,在读取文件时,您想要用于处理代码的无符号字节。要获取介于128和255之间的值,可以使用short,但通过使用int,您将更有效地对齐内存寄存器和数据总线。因此,使用int实际上不会丢失任何信息,并且可能会获得一些性能提升。唯一的缺点是内存成本,但很有可能您不会长时间保留该int(因为您将处理它并将其转换为char或byte[])。
因此它可以返回“-1”。当没有更多字节可读取时,必须这样做。
不能让它有时返回一个字节和-1表示EOF / noyte / whatever,所以它返回一个int;)
因为EOF(文件结束或通常是数据结束)无法使用char表示。
追加到BalusC answer:
byte
作为主要容量,允许[0; 255]并允许额外的-1作为EOF结果。int
用于将结果调整为机器字(I/O操作的主要要求之一是速度,因此它们应该尽可能快地工作!)不使用异常,因为它们会显著减慢程序运行速度!
readInt()
、readShort()
、readByte()
、readChar()
、readBoolean()
、readFloat()
、readDouble()
、readObject()
等会抛出 EOFException
,因为没有超出带外值可以返回。 - user207421
InputStream
时返回一个byte
(隐式转换),请不要忘记对返回值应用& 0xFF
(除非你返回的是EOF
)。否则,你将返回一个有符号值,它可能乍一看起来能正常工作,但实际上是完全错误的。 - Mmmh mmhshort
并没有被使用,因为它没有适应 Java 虚拟机字长,该字长为 4 字节。int
正好适合一个字,并且使用 int 值更快,因为避免了结果中的内存调整。出于同样的原因,perm 和 instances heap 中的所有类也都调整为 4 字节。 - radistao