这段代码怎么工作呢?

时间:2013-10-19 07:13:38

标签: java io

我刚开始使用java中的I / O,请原谅我,如果我的疑问是愚蠢的,但我发现很难理解这段代码是如何工作的? 下面代码中的变量c没有递增,那么while循环将永远不会终止,即使输入流中只有一个字符,输出流将只连续填充一个字符,但这段代码实际上工作得很满意,我不明白为什么?

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

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);
        }
    } finally {
        if (in != null) {
            in.close();
        }
        if (out != null) {
            out.close();
        }
    }
}
}

4 个答案:

答案 0 :(得分:4)

从Java API:“FileInputStream从文件系统中的文件获取输入字节。可用的文件取决于主机环境。”

您的字符c用于从流中“读取”字节,当没有剩余字节要读取时,read()方法返回-1并且会破坏循环。

这就是

((c = in.read()) != -1)

表示读取,直到值为-1。

答案 1 :(得分:2)

当您使用read ()方法时,实际上每次都会移动您正在阅读的位置,直到您到达文件末尾。这就是它的原因。

答案 2 :(得分:2)

in.read()方法一次读取一个字符。每次迭代one character都被读取并分配给c。

请考虑xanadu.txt文件中存在以下字符。

"ABCDE-1"

注意:文件结尾的-1含义(-1仅用于说明目的)

在第一次迭代中

c=A while-> A!=-1然后是真的。然后继续while循环并将c='A'保存到outagain.txt文件。

在第二次迭代中

c=B while -> B!=-1然后是真的。然后继续while循环并将c='B'保存到outagain.txt文件。

在第三次迭代中

c=C while -> C!=-1然后是真的。然后继续while循环并将c='C'保存到outagain.txt文件。

在第四次迭代中

c=D while -> D!=-1然后是真的。然后继续while循环并将c='D'保存到outagain.txt文件。

在第五次迭代中

c=E while -> E!=-1然后是真的。然后继续while循环并将c='E'保存到outagain.txt文件。

在第六次迭代中

c=-1 while -> -1!=-1然后是假的。然后退出while循环

答案 3 :(得分:0)

来自read对象的函数FileInputStream返回下一个数据字节,如果到达文件末尾则返回-1。 (它实际上返回int

来源:http://docs.oracle.com/javase/6/docs/api/java/io/FileInputStream.html#read%28%29

在您的循环中,您正在执行:c = in.read(),直到c等于-1。因此,在每次迭代时,c包含下一个字节。 read进行增量本身。