我想使用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 为什么输出文件中有很多额外的字符?
答案 0 :(得分:5)
当您致电infile.read
时,返回值会告诉您要回收的物品数量。当您调用outfile.write
时,您告诉它缓冲区已填满,因为您没有存储从read
调用中返回的字节数。
要解决此问题,请存储字节数,然后将正确的数字传递给write
:
byte[] b = new byte[1024];
int len;
while((len = infile.read(b, 0, 1024)) > 0){
outfile.write(b, 0, len);
}
答案 1 :(得分:1)
您正在尝试将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();
答案 2 :(得分:0)
数组b []的大小为1KB。额外的角色' @'附加以显示该文件仍有未使用的空间。从技术上讲,您正在复制字节数组中的文件并在输出文件中写入but数组。这就是出现这个问题的原因。
答案 3 :(得分:0)
复制文件最简单的方法是调用单一方法
1. Java 7之前 - 来自Google Guava库
com.google.common.io.Files#copy(File from,
File to)
2.在Java 7& 8
java.nio.file.Files#copy(Path source, Path target, CopyOption... options)