-2

我应该编写一个类似于 Unix cp 命令的程序。我找到了这段代码,但无法真正弄清楚它是如何/为什么工作的。

        FileInputStream in = new FileInputStream(args[0]);
        FileOutputStream out = new FileOutputStream(args[1]);
        byte[] buf = new byte[1024];
        int i = 0;
        while ((i = in.read(buf)) != -1) {
            out.write(buf, 0, i);
        }

while 循环是如何工作的?我想它以 1024 字节部分从 InputStream 中读取,将它们保存到字节数组 buf,然后将 buf 写入新文件。

但是什么

in.read(buf);

分配给我?while 如何循环遍历整个文件(告诉 in.read(buf) 读取下一个 1024 字节的数据,而不是一遍又一遍的前 1024 个字节)?

谢谢,P。

4

4 回答 4

3

所以让我们一步一步来,是吗?

FileInputStream in = new FileInputStream(args[0]);
FileOutputStream out = new FileOutputStream(args[1]);
byte[] buf = new byte[1024];
int i = 0;
while ((i = in.read(buf)) != -1) {
    out.write(buf, 0, i);
}

前四行并不难。创建一个输入和输出流。分配大小为 1024 的缓冲区。

下一步是while循环。执行的第一件事是:

(i = in.read(buf))

buf这会尽可能多地读入缓冲区,然后返回读取的字节。然后将其分配给i,来自流i的字节数也是如此。buf

请注意,read()调用将推进流。这意味着它不会重复字节。因此,如果您的流是:

1 51 23 10 6 73

你可能会读到

1 51

返回2(读入的数字)。流现在是:

23 10 6 73

回到循环!从流中读入后,我们检查是否有任何内容读入buf

... != -1

注意

(i = in.read(buf))

计算为 的值i,因此循环条件为while (i != -1)。该语句如此评估的原因与我们可以这样做的原因相似:

a = b = 1;

这真的是:

a = (b = 1);

下一行非常简单。将所有字节写入buffrom0i

所以最后,这个循环可以重写为:

while(true){
    int i = in.read(buf);
    if(i == -1)
        break;
    out.write(buf, 0, i);
}
于 2013-06-13T13:24:52.150 回答
1

while 如何循环遍历整个文件(告诉 in.read(buf) 读取接下来的 1024 个字节的数据,而不是一遍又一遍的前 1024 个字节)?

while ((i = in.read()) != -1) {
            out.write(buf, 0, i);
}

相当于:

i = in.read();
while (i != -1) {
        out.write(buf, 0, i);
        i = in.read();
}
于 2013-06-13T13:17:27.133 回答
1
in.read(buf)

返回读入 buf 的字节数。如果之前到达文件末尾,则返回-1。

来源:http://docs.oracle.com/javase/6/docs/api/java/io/FileInputStream.html#read()

文件有一个指针,每次访问(读/写)都会移动,因此下一次读/写将从最后一次结束的地方开始。

于 2013-06-13T13:19:36.143 回答
1
public int read(byte[] b) throws IOException

从此输入流中读取最多 b.length 个字节的数据到字节数组中。此方法会阻塞,直到某些输入可用。

返回读入缓冲区的总字节数,如果由于已到达文件末尾而没有更多数据,则返回 -1。

while 循环正在检查是否仍有要读取的数据,并且i正在分配已读取的字节数。然后它用于将正确数量的字节写入输出流。

pubilc void write(byte[] b, int off, int len) throws IOException

从偏移量 off 开始的指定字节数组中写入 len 个字节到此文件输出流。

于 2013-06-13T13:20:17.743 回答