可能重复:
Why does InputStream#read() return an int and not a byte?
嘿,我只是在I / O流上浏览java文档,并且只是在参考字节流时遇到了这个问题 - 如果输入是字节流,为什么不读取()返回一个字节价值?
我抓了一段时间,但是如果有人可以提供帮助的话我想不出任何有力的答案我会感激不尽。
答案 0 :(得分:6)
这是因为read
可以返回-1作为流末尾(EOF)标记的指示符 - 即不再从流中读取字节。
更多详情:http://download.oracle.com/javase/1.4.2/docs/api/java/io/InputStream.html#read%28%29。具体做法是:
如果没有可用的字节,因为流的结尾已经存在 到达时,返回值-1。
答案 1 :(得分:0)
原因是read
方法也可以返回值-1
(当到达流的末尾时)。 因此,您必须能够存储256个值。
有些人认为byte
的负范围是一个问题,但这实际上是不相关的:一个字节的范围为0 - 255
,但是在java中,byte
的范围为-128 - 127
。但是,即使其值大于127,您仍然可以完美地将int
投射到byte
。这只会导致负值。
作为证据,有一种read(byte[])
方法在内部使用int read()
方法并将其结果转换为byte
(在过滤可能的-1
值之后)。所以,这清楚地告诉我们,如果它不是-1
值,那么java毕竟会使用字节。
一个更难的问题:"为什么不是short
而不是int
?" 答案是,java没有&#t; t非常喜欢short
。执行基本操作时,short
通常会自动投放到int
,从而引入某种不必要的过度杀伤。 使用短裤几乎没有收获。