这个简单的复制程序如何工作

时间:2013-06-13 13:14:03

标签: java

我应该编写一个类似于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循环如何工作?我想它从InputStream读取1024字节部分,将它们保存到字节数组buf然后将buf写入新文件。

但是

是什么
in.read(buf);

分配给我?并且while循环遍及整个文件(告诉in.read(buf)读取下一个1024字节的数据而不是相同的第一个1024一遍又一遍)?

谢谢, P上。

4 个答案:

答案 0 :(得分: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,因此ibuf中来自流的字节数。

请注意,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);

下一行很简单。将buf中的所有字节从0写入i

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

while(true){
    int i = in.read(buf);
    if(i == -1)
        break;
    out.write(buf, 0, i);
}

答案 1 :(得分: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();
}

答案 2 :(得分:1)

in.read(buf)

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

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

文件有一个随每次访问(读/写)移动的指针,因此下一个读/写将从最后一个读取/写入开始。

答案 3 :(得分:1)

public int read(byte[] b) throws IOException
  

将此输入流中的b.length个字节数据读入   字节数组。此方法将阻止,直到某些输入可用。

     

返回读入缓冲区的总字节数,如果存在,则返回-1   不再是数据,因为已经到达文件的末尾。

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

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

从offset off处开始写入指定字节数组中的len个字节   到这个文件输出流。