1

我刚开始使用 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

4 回答 4

4

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

您的字符 c 被用于从流中“读取”字节,当没有更多字节可供读取时, read() 方法返回 -1 并且这将中断循环。

就是这样

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

意思是,读到值是-1。

于 2013-10-19T07:17:13.070 回答
2

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

于 2013-10-19T07:19:00.900 回答
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循环

于 2013-10-19T07:28:39.863 回答
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在做增量本身。

于 2013-10-19T07:27:57.853 回答