为什么InputStream#read()返回一个int而不是一个字节?

时间:2011-01-11 16:04:22

标签: java inputstream

为什么InputStream#read()会返回int而不是byte

6 个答案:

答案 0 :(得分:53)

因为byte只能保持-128直到127,而它应该返回0到255(当没有字节时返回-1(即EOF))。即使它返回byte,也没有空间来代表EOF。

一个更有趣的问题是为什么它不会返回short

答案 1 :(得分:16)

它返回一个int,因为当无法再读取流时,它返回-1。

如果它返回一个字节,则无法返回-1表示缺少输入,因为-1是一个有效字节。此外,您不能返回高于127或低于-128的值,因为Java只处理带符号的字节。

很多时候,当一个人正在读取文件时,您需要处理代码的无符号字节。要获得介于128和255之间的值,可以使用short,但通过使用int,您可以更有效地将内存寄存器与数据总线对齐。因此,使用int并不会真正丢失任何信息,并且您可能会获得一些性能。唯一的缺点是内存的成本,但很可能你不会长时间停留在那个int上(因为你将处理它并将其转换为char或byte [])。

答案 2 :(得分:4)

所以它可以返回“-1”。当没有更多字节要读时,它必须这样做。

你不能让它有时返回一个字节和-1为EOF / nobyte / what,所以它返回一个int;)

答案 3 :(得分:2)

因为无法使用char来表示EOF(文件末尾或一般数据结尾)。

答案 4 :(得分:1)

正如Java文档在InputStream#read中所说的那样,值字节作为int返回,范围为0到255 。也就是说字节值[-128~127]已经改为int值[0~255],因此返回值可以用来表示流的结束。

答案 5 :(得分:0)

附加到BalusC answer

  • 不是byte允许 [0; 255] 作为主要容量,另外 -1 作为EOF结果
  • int用于将结果调整为机器字(I / O操作的主要要求之一 - velocity ,因此它们应该尽可能快地工作!)

没有使用异常,因为它们非常慢!