用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