我应该编写一个类似于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上。
答案 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
,因此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);
下一行很简单。将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个字节 到这个文件输出流。