Java 为什么InputStream#read()返回int而不是字节?
为什么返回的是Java 为什么InputStream#read()返回int而不是字节?,java,inputstream,Java,Inputstream,为什么返回的是int而不是字节呢?因为EOF(文件结尾或通常是数据结尾)不能用字符表示。所以它可以返回“-1”。当没有更多的字节可读取时,它必须这样做 您不能让它有时返回一个字节,而-1表示EOF/nobyte/where,因此它返回一个int;) 因为字节只能在127之前保持-128,而在255之前它应该返回0(当没有剩余字节(即EOF)时返回-1)。即使它返回字节,也没有空间表示EOF 一个更有趣的问题是,为什么它不返回short它返回一个int,因为当流不再被读取时,它返回-1 如果返回一
int
而不是字节呢?因为EOF(文件结尾或通常是数据结尾)不能用字符表示。所以它可以返回“-1”。当没有更多的字节可读取时,它必须这样做
您不能让它有时返回一个字节,而-1表示EOF/nobyte/where,因此它返回一个int;) 因为字节
只能在127之前保持-128,而在255之前它应该返回0(当没有剩余字节(即EOF)时返回-1)。即使它返回字节
,也没有空间表示EOF
一个更有趣的问题是,为什么它不返回short
它返回一个int,因为当流不再被读取时,它返回-1
如果返回一个字节,则无法返回-1以指示缺少输入,因为-1是一个有效字节。此外,不能返回大于127或小于-128的值,因为Java只处理有符号字节
很多时候,当一个人正在读取一个文件时,你需要处理代码的无符号字节。要获得128到255之间的值,可以使用short,但通过使用int,可以更有效地将内存寄存器与数据总线对齐。因此,使用int不会真正丢失任何信息,并且可能会获得一些性能。唯一的缺点是内存成本,但很可能您不会长时间保留该int(因为您将对其进行处理并将其转换为字符或字节[])。正如Java文档在中所述,值字节作为int返回,范围为0到255。也就是说字节值[-128~127]已更改为int值[0~255],因此返回值可用于表示流的结束 附加到:
- 不是一个
字节
,允许[0;255]作为主容量,额外的-1作为EOF结果
int
用于将结果调整为机器字(I/O操作的主要要求之一-速度,因此它们应尽可能快地工作!)
不使用异常,因为它们非常慢 不能使用byte和-1,因为此值正确且可能出现在数据中。不能使用byte
表示它,因为没有带外值可用。它可以用大于8位的任何数据类型表示。@dogbane,@BalusC-我想是因为int比short快。简而言之,指令集相当有限,因此JVM无论如何都会将其视为int。参考资料:@Ishtar那么你的意思是短裤完全没用,永远不会被任何人使用?我不得不说这一切都很令人沮丧。从字面上来说,8位是一个太短的数字。他们不能让它返回字节,然后在EOF上抛出异常吗?我知道java的一般原理是不要对控制流使用异常处理,但每件事都有异常。如果在InputStream
的实现中返回byte
(隐式转换),不要忘记对返回值应用&0xFF
(除非返回EOF
)。否则,您将返回一个带符号的值,乍一看可能有效,但实际上完全无效。我认为short
没有使用,因为它没有调整为java机器字,即4字节int
正好适合一个单词,并且可以更快地处理int值,因为可以避免结果中的内存调整。出于同样的原因,perm和instances堆中的所有类也被调整为4字节。它返回int,因为当EOF发生时,它返回-1。当发生错误时,它会抛出一个异常,-1是为EOF保留的,这应该是唯一的原因,因为InputStream有另一个方法int read(字节b[]),该方法将字节作为块读取,并将它们作为字节数组返回。int read()方法可能返回257个值(256个可能的字节值+EOF返回语句)@user207421可能会在游戏中迟到,但我已更新以删除“错误”位。