如果你仔细看API的话,那么你就能看见read是覆盖的InputStream里面的同名方法,而它的解释为:
ead
public abstract int read()
throws IOException
从输入流中读取数据的下一个字节。返回 0 到 255 范围内的 int 字节值。如果因为已经到达流末尾而没有可用的字节,则返回值 -1。在输入数据可用、检测到流末尾或者抛出异常前,此方法一直阻塞。
子类必须提供此方法的一个实现。
返回:
下一个数据字节;如果到达流的末尾,则返回 -1。
抛出:
IOException - 如果发生 I/O 错误。
可以看出,它的返回值为0-255,但是byte的范围呢?-128-127,也就是说前面所说的读取一个字节的内容并不是java中的byte。
也就是说你把一个字节的数据和java中的byte类型的数据混淆了。
而且在除非特殊情况是不建议使用byte数据类型的,容易引起数据的溢出。
read()
从此输入流中读取下一个数据字节。返回一个 0 到 255 范围内的 int 字节值。如果因为已经到达流末尾而没有字节可用,则返回 -1。
可见此数据字节并不等同于java中的byte(范围: -128-->127)
由于此方法是native我们也无法查看具体细节,以后看API仔细点就是了~~~
java网站的解释:
Notice that read() returns an int value. If the input is a stream of bytes, why doesn't read() return a byte value? Using a int as a return type allows read() to use -1 to indicate that it has reached the end of the stream.
为什么读取的是byte而返回一个int?因为想使用-1来表示流的结尾。
你问的存放问题:
byte是一个字节,int是四个字节,在int b = strean.read()后,java会自动类型转换(按照隐式转换的原则,低级变量可以直接转换为高级变量,将byte的数据放入int的第一个字节)