在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); 

尝试使用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看起来最快。 我为每个类使用了相同的简单文本文件。