一尘不染

在Java中复制文件的标准简洁方法?

java

一直困扰着我,用Java复制文件的唯一方法是打开流,声明缓冲区,读入一个文件,循环遍历并将其写出到另一流。Web上散布着这种解决方案的类似但仍然略有不同的实现。

有没有更好的方法可以保留在Java语言的范围内(意味着不涉及执行OS特定的命令)?也许在某个可靠的开源实用程序包中,这至少会掩盖该基本实现并提供一线解决方案?


阅读 483

收藏
2020-02-26

共2个答案

一尘不染

如上面的工具包所述,Apache Commons IO尤其是FileUtils是必经之路。copyFile() ; 它为您处理所有繁重的工作。

并且作为一个后记,请注意,FileUtils的最新版本(例如2.0.1发行版)增加了使用NIO复制文件的功能。NIO可以显着提高文件复制性能,这在很大程度上是因为NIO例程将复制直接推迟到OS /文件系统,而不是通过在Java层中读写字节来处理。因此,如果您正在寻找性能,那么可能值得检查一下您是否在使用最新版本的FileUtils。

2020-02-26
一尘不染

我会避免使用像Apache Commons这样的大型api。这是一个简单的操作,它内置在新NIO包中的JDK中。以前的答案中已经链接了这种方法,但是NIO api中的关键方法是新功能“ transferTo”和“ transferFrom”。

http://java.sun.com/javase/6/docs/api/java/nio/channels/FileChannel.html#transferTo(long,%20long,%20java.nio.channels.WritableByteChannel)

链接的文章之一显示了一种很好的方法,可以使用transferFrom将功能集成到代码中:

public static void copyFile(File sourceFile, File destFile) throws IOException {
    if(!destFile.exists()) {
        destFile.createNewFile();
    }

    FileChannel source = null;
    FileChannel destination = null;

    try {
        source = new FileInputStream(sourceFile).getChannel();
        destination = new FileOutputStream(destFile).getChannel();
        destination.transferFrom(source, 0, source.size());
    }
    finally {
        if(source != null) {
            source.close();
        }
        if(destination != null) {
            destination.close();
        }
    }
}

学习NIO可能会有些棘手,因此你可能只想在开始尝试通宵学习NIO之前就信任此机制。从个人经验来看,如果你没有经验,并且是通过java.io流介绍给IO的,则可能很难学习。

2020-02-26