为什么InputStream#read()
会返回int
而不是byte
?
答案 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 ,因此它们应该尽可能快地工作!)没有使用异常,因为它们非常慢!