【发布时间】:2011-06-07 06:37:49
【问题描述】:
为什么InputStream#read() 返回int 而不是byte?
【问题讨论】:
标签: java inputstream
为什么InputStream#read() 返回int 而不是byte?
【问题讨论】:
标签: java inputstream
因为byte 只能保存 -128 到 127,而它应该返回 0 到 255(当没有剩余字节时返回 -1(即 EOF))。即使返回byte,也没有空间来表示EOF。
一个更有趣的问题是为什么它不返回short。
【讨论】:
InputStream 的实现中返回byte(隐式转换),请不要忘记将& 0xFF 应用于您的返回值(除非您返回EOF)。否则,您将返回一个带符号的值,乍一看可能有效,但确实完全被破坏了。
short没有被使用,因为它没有调整为java机器字,即4字节。 int 正好适合一个词,并且使用 int 值更快,因为避免了结果中的内存调整。出于同样的原因,perm 和实例堆中的所有类也都调整为 4 个字节。
它返回一个int,因为当流无法再被读取时,它返回-1。
如果它返回一个字节,则无法返回 -1 以指示缺少输入,因为 -1 是一个有效字节。此外,您不能返回大于 127 或小于 -128 的值,因为 Java 只处理有符号字节。
很多时候在读取文件时,您需要处理代码的无符号字节。要获得 128 到 255 之间的值,您可以使用 short,但通过使用 int,您可以更有效地将内存寄存器与数据总线对齐。因此,使用 int 并不会真正丢失任何信息,并且可能会获得一些性能。唯一的缺点是内存成本,但您可能不会长时间挂在该 int 上(因为您将处理它并将其转换为 char 或 byte[])。
【讨论】:
所以它可以返回 "-1" 。当没有更多字节要读取时,它必须这样做。
你不能让它有时返回一个字节 AND -1 表示 EOF/nobyte/whatever,所以它返回一个 int ;)
【讨论】:
正如 Java 文档在 InputStream#read 中所说,值字节以 int 形式返回,范围为 0 到 255。也就是说byte值[-128~127]变成了int值[0~255],所以返回值可以用来表示流的结束。
【讨论】:
因为 EOF(文件结尾或通常是数据结尾)无法使用 char 表示。
【讨论】:
byte 表示,因为没有可用的带外值。它可以以任何大于 8 位的数据类型表示。
附加到BalusC answer:
byte 允许[0; 255] 作为主要容量,另外 -1 作为 EOF 结果int 用于将结果调整为机器字(I/O 操作的主要要求之一 - 速度,因此它们应该尽可能快地工作!)没有使用异常,因为它们非常慢!
【讨论】: