使用 FileStream 在 Java 中复制文件

copy file in Java using FileStream

我想使用 FileStream 在 Java 中复制一个文件。 这是我的代码。

FileInputStream infile = new FileInputStream("in");
FileOutputStream outfile = new FileOutputStream("out");

byte[] b = new byte[1024];
while(infile.read(b, 0, 1024) > 0){
    outfile.write(b);
}

infile.close();
outfile.close();

我使用 vim 查看我的文件。
输入文件 "in"

Hello World1
Hello World2
Hello World3

输出文件"output"

Hello World1
Hello World2
Hello World3
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@...

输出文件中有很多额外的'^@'。
输入文件的大小为 39 字节。
输出文件的大小为 1KB。
为什么输出文件中有很多额外的字符?

当您调用 infile.read 时,return 值告诉您要取回多少项目。当您调用 outfile.write 时,您告诉它缓冲区已满,因为您没有存储从 read 调用返回的字节数。

要解决此问题,请存储字节数,然后将正确的数字传递给 write:

byte[] b = new byte[1024];
int len;
while((len = infile.read(b, 0, 1024)) > 0){
    outfile.write(b, 0, len);
}

您正在尝试将 1024 字节从一个文件复制到另一个文件。那不会很好地工作。尝试按文件大小读取。

FileInputStream infile = new FileInputStream("in");
FileOutputStream outfile = new FileOutputStream("out");

byte[] b = new byte[infile.getChannel().size()];
while(infile.read(b, 0, infile.getChannel().size()) > 0){
    outfile.write(b);
}

infile.close();
outfile.close();

数组b[]的大小为1KB。附加的额外字符“@”表明该文件仍有未使用的 space。从技术上讲,您是在字节数组中复制文件,然后在输出文件中写入 but 数组。这就是为什么会出现这个问题。

复制文件最简单的方法是调用单一方法
1. 在 Java 7 之前 - 来自 Google Guava 图书馆
com.google.common.io.Files#copy(文件来自, 归档至)
2. 在 Java 7 & 8
java.nio.file.Files#copy(Path source, Path target, CopyOption... options)