Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么InputStream#read()返回int而不是字节?_Java_Inputstream - Fatal编程技术网

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可能会在游戏中迟到,但我已更新以删除“错误”位。