使用FileStream

时间:2016-03-04 02:43:57

标签: java fileinputstream fileoutputstream

我想使用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 为什么输出文件中有很多额外的字符?

4 个答案:

答案 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)