在Java中移动/复制文件操作
有没有一个标准的Java库来处理常见的文件操作,如移动/复制文件/文件夹?
以下是如何使用java.nio
操作完成此操作:
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(); // previous code: destination.transferFrom(source, 0, source.size()); // to avoid infinite loops, should be: long count = 0; long size = source.size(); while((count += destination.transferFrom(source, count, size-count))<size); } finally { if(source != null) { source.close(); } if(destination != null) { destination.close(); } } }
现在还没有,但是新的NIO(JSR 203)将会支持这些常见的操作。
同时,还有一些事情要记住。
File.renameTo通常只在同一个文件系统卷上工作。 我认为这相当于一个“mv”命令。 如果可以,请使用它,但是对于一般的复制和移动支持,您需要有一个回退。
当重命名不起作用时,您将需要实际复制文件(如果是“移动”操作,则使用File.delete删除原始文件)。 要以最高效率执行此操作,请使用FileChannel.transferTo或FileChannel.transferFrom方法。 这个实现是特定于平台的,但一般来说,当从一个文件复制到另一个文件时,实现避免了在内核和用户空间之间来回传输数据,从而大大提高了效率。
查看: http : //commons.apache.org/io/
它有副本,如前所述,JDK已经有所动作。
不要实现你自己的复制方法。 有那么多的漂浮在那里…
以前的答案似乎已经过时了。
Java的File.renameTo()可能是API 7最简单的解决scheme,似乎工作正常。 小心,它不会抛出exception,但返回true / false!
请注意,在以前的版本中似乎有问题(与NIO相同)。
如果您需要使用以前的版本,请点击此处 。
Here's an example for API7: File f1= new File("C:\\Users\\.....\\foo"); File f2= new File("C:\\Users\\......\\foo.old"); System.err.println("Result of move:"+f1.renameTo(f2));
或者:
System.err.println("Move:" +f1.toURI() +"--->>>>"+f2.toURI()); Path b1=Files.move(f1.toPath(), f2.toPath(), StandardCopyOption.ATOMIC_MOVE ,StandardCopyOption.REPLACE_EXISTING );); System.err.println("Move: RETURNS:"+b1);
谷歌的番石榴图书馆也有这些:
http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/io/Files.html
尝试使用org.apache.commons.io.FileUtils (通用文件操作实用程序)。 设施以下列方法提供:
(1) FileUtils.moveDirectory(File srcDir,File destDir) =>移动一个目录。
(2) FileUtils.moveDirectoryToDirectory(File src,File destDir,boolean createDestDir) =>将目录移动到另一个目录。
(3) FileUtils.moveFile(File srcFile,File destFile) =>移动文件。
(4) FileUtils.moveFileToDirectory(File srcFile,File destDir,boolean createDestDir) =>将文件移动到目录。
(5) FileUtils.moveToDirectory(File src,File destDir,boolean createDestDir) =>将文件或目录移动到目标目录。
这很简单,方便,快捷。
有趣的观察:试图通过各种java类复制相同的文件,并在纳秒内打印时间。
使用FileOutputStream字节stream的持续时间:4 965 078
使用BufferedOutputStream的持续时间:1 237 206
使用时间(字符文本阅读器:2 858 875
使用BufferedReader的持续时间(缓冲字符文本stream:1 998 005
使用(文件NIO副本)的持续时间:18 351 115
当使用文件Nio复制选项,它花了近18倍! Nio是复制文件的最慢选项,BufferedOutputStream看起来最快。 我为每个类使用了相同的简单文本文件。