JAVA中关于Fileinputstream类的read()方法的一个问题,我不太明白,请高手解答一下。

2024-12-20 13:55:45
推荐回答(3个)
回答1:

如果你仔细看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数据类型的,容易引起数据的溢出。

回答2:

read()
从此输入流中读取下一个数据字节。返回一个 0 到 255 范围内的 int 字节值。如果因为已经到达流末尾而没有字节可用,则返回 -1。

可见此数据字节并不等同于java中的byte(范围: -128-->127)
由于此方法是native我们也无法查看具体细节,以后看API仔细点就是了~~~

回答3:

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的第一个字节)