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

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

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

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

它返回一个int,因为当stream不能被读取时,它返回-1。

如果它返回一个字节,则-1不能被返回来指示一个错误,因为-1是一个有效的字节。 另外,由于Java只能处理有符号的字节,所以你不能返回127或者低于-128的值。

很多时候,当你正在阅读一个文件时,你需要处理代码的无符号字节。 要获得128到255之间的值,可以使用short,但是通过使用int,可以更有效地将内存寄存器与数据总线alignment。 因此,使用int不会丢失任何信息,而且可能会获得一些性能。 唯一的缺点是内存的成本,但是你不会长时间挂在这个int上(因为你会处理它并把它变成char或byte [])。

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

你不能让它返回一个字节有时AND-EOF / nobyte /无论如何,所以它返回一个int;)

因为EOF(文件结束或通常数据结束)不能用char来表示。

正如Java文档中的InputStream#read所示 , 值字节在0到255范围内以intforms返回 。 也就是说字节值[-128〜127]已经改成了int值[0〜255],所以返回值可以用来表示stream的结束。

附加到BalusC答案 :

  • 不是允许[0; 255]作为主要能力,另外还有-1作为EOF结果
  • int用于将结果调整为机器字(I / O操作的主要要求之一 – 速度 ,所以它们应该尽可能快地工作!)

不使用exception,因为它们非常慢!