一直困扰着我,用Java复制文件的唯一方法是打开流,声明缓冲区,读入一个文件,循环遍历并将其写出到另一流。Web上散布着这种解决方案的类似但仍然略有不同的实现。
有没有更好的方法可以保留在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的,则可能很难学习。