如何使用BufferedInputStream和BufferedOutputStream在JAVA中复制文件?

4
我想使用 BufferedInputStreamBufferedOutputStream 来复制源文件到目标文件,以便处理大型二进制文件。

这是我的代码:

   byte[] buffer = new byte[1000];        
    try {
        FileInputStream fis = new FileInputStream(args[0]);
        BufferedInputStream bis = new BufferedInputStream(fis);

        FileOutputStream fos = new FileOutputStream(args[1]);
        BufferedOutputStream bos = new BufferedOutputStream(fos);

        int numBytes;
        while ((numBytes = bis.read(buffer))!= -1)
        {
            bos.write(buffer);
        }
        //bos.flush();
        //bos.write("\u001a");

        System.out.println(args[0]+ " is successfully copied to "+args[1]);

        bis.close();
        bos.close();
    } catch (IOException e)
    {
        e.printStackTrace();
    }

我可以成功地复制,但是之后我使用了


cmp src dest

在命令行中比较两个文件时,出现了错误信息:

cmp: 文件已到达结尾

请问我哪里做错了?


你正在读取的文件中是否有数据?或者是否出现了任何异常? - Prashant
4个回答

10

这是错误:

bos.write(buffer);

即使您只读入部分数据,您仍然会将整个缓冲区写出。您应该使用:

bos.write(buffer, 0, numBytes);

如果您使用Java 7或更高版本,我建议您使用try-with-resources,否则请将close调用放在finally块中。正如Steffen所指出的那样,如果您可以使用它,Files.copy是一个更简单的方法。

非常感谢!我尝试了bos.write(buffer, 0, numBytes)。它有效! - user4486171
@BinbinTang:哎呀,是的 - 已经在答案中修复了 :) - Jon Skeet

2

你需要关闭你的FileOutputStreamFileInputStream

另外,你可以像下面这样使用FileChannel进行复制

FileChannel from = new FileInputStream(sourceFile).getChannel();
FileChanngel to = new FileOutputStream(destFile).getChannel();
to.transferFrom(from, 0, from.size());
from.close();
to.close();

这是逐字复制,非常低效。 - Jon Skeet
是的,每次复制一个字节太低效了。 - user4486171
@JonSkeet 是的,已修改。 - shikjohari
我发现当复制大于C盘(应用程序所在位置)剩余可用空间(100GB)的文件时,这种方法不起作用。我目前正在尝试使用BufferedInputStreamBufferedOutputStream,它似乎可以工作,但速度有点慢。是否有更快的版本,不需要C盘上的可用空间?也许是缓冲流的某个版本? - trademark

2
如果您正在使用Java 8,请尝试使用Files.copy(Path source, Path target)方法进行复制。

有关复制文件的一些额外信息:http://www.journaldev.com/861/4-ways-to-copy-file-in-java - Steffen

0
你可以使用 apatch-commons 库中的 IOUtils
我认为你需要的是 copyLarge 函数。

根据这篇文章(http://www.journaldev.com/861/4-ways-to-copy-file-in-java)所述,Apache Commons是最慢的解决方案。 - Steffen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接