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

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

是否有更好的方法保持在Java语言的范围之内(意思是不涉及执行特定于OS的命令)? 也许在一些可靠的开源工具包中,这至少会掩盖这个潜在的实现并提供单线解决方案?


正如上面提到的工具包一样,Apache Commons IO是要走的路,特别是FileUtils.copyFile(); 它为您处理所有繁重的工作。

作为后记,请注意最近版本的FileUtils(如2.0.1版本)已添加了NIO用于复制文件的功能; NIO可以显着提高文件复制性能,这在很大程度上是因为NIO例程推迟直接复制到OS /文件系统,而不是通过Java层读取和写入字节来处理它。 因此,如果您正在寻找性能,则可能需要检查您使用的是最新版本的FileUtils。


我会避免使用像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,可能会非常困难。


现在使用Java 7,您可以使用以下尝试与资源语法:

public static void copyFile( File from, File to ) throws IOException {

    if ( !to.exists() ) { to.createNewFile(); }

    try (
        FileChannel in = new FileInputStream( from ).getChannel();
        FileChannel out = new FileOutputStream( to ).getChannel() ) {

        out.transferFrom( in, 0, in.size() );
    }
}

或者,更好的是,这也可以使用Java 7中引入的新的Files类来完成:

public static void copyFile( File from, File to ) throws IOException {
    Files.copy( from.toPath(), to.toPath() );
}

很时髦,呃?

链接地址: http://www.djcxy.com/p/6121.html

上一篇: Standard concise way to copy a file in Java?

下一篇: How to copy the entire contents of directory in C#?