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

来源:百度知道 编辑:UC知道 时间:2024/09/27 08:12:49
import java.io.*;
public class TestFileOutputStream {
public static void main(String[] args) {
int b = 0;
FileInputStream in = null;
FileOutputStream out = null;
try {
in = new FileInputStream("d:/share/java/HelloWorld.java");
out = new FileOutputStream("d:/share/java/io/HW.java");
while((b=in.read())!=-1){ ////////// A
out.write(b); ////////// B
}
in.close();
out.close();
} catch (FileNotFoundException e2) {
System.out.println("找不到指定文件"); System.exit(-1);
} catch (IOException e1) {
System.out.println("文件复制错误"); System.exit(-1);
}
System.out.println("文件已复制");
}
}

关于A处的语句b=in.read(), API文档说read()方法“从此输入流中读取一个数据字节。如果没有输入可用,则此方法将阻塞。”那么读取的这个字节存到哪里去了,是存放在int类型的b的空间里了吗?如果是的话,那为什么要把字节存放到一个int类型的空间里而不是byte类型的空间。
API文档说read()方法返回“下一个数据字节

如果你仔细看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 stre