当我查看示例代码时,我在I / O上刷新了自己,我看到了让我感到困惑的事情:
public class CopyBytes {
public static void main(String[] args) throws IOException {
FileInputStream in = null;
FileOutputStream out = null;
try {
in = new FileInputStream("xanadu.txt");
out = new FileOutputStream("outagain.txt");
int c;
while ((c = in.read()) != -1) {
out.write(c);
}
如何将int值(c)分配给输入流(in.read())中的一个数据字节?为什么while循环等于它不等于-1?
答案 0 :(得分:2)
当达到输入结束时,此(c = in.read())
将返回-1
,因此while循环将停止。
阅读这篇真棒answer。
来自Oracle docs:
public abstract int read()
throws IOException从输入流中读取下一个数据字节。值字节作为int返回,范围为0 如果没有可用的字节,因为流的末尾已经存在 到达时,返回值-1。此方法阻塞直到输入数据 可用,检测到流的末尾,或者是异常 抛出。子类必须提供此方法的实现。返回:数据的下一个字节,如果流的结尾是
-1
,则返回 到达。 抛出:IOException - 如果发生I / O错误。
答案 1 :(得分:0)
来自FileInputStream.read()的文档:
public int read() 抛出IOException
因此read()返回整数而不是字节,因此可以将其分配给int
变量。
请注意,int可以隐式转换为int而不会丢失。同样来自文档:
返回: 数据的下一个字节,如果到达文件末尾则为-1。
对-1的循环检查确定是否已到达文件末尾,如果是,则停止循环。