题
是否有标准的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 如果它是<!> quot; move <!> quot; operation)。要以最高效率执行此操作,请使用 FileChannel.transferTo 或 FileChannel.transferFrom 方法。实现是特定于平台的,但通常,当从一个文件复制到另一个文件时,实现避免在内核和用户空间之间来回传输数据,从而大大提高了效率。
以前的答案似乎已经过时了。
Java的 File.renameTo()可能是API 7最简单的解决方案,似乎工作正常。 小心它不会出现异常,但返回真/假!!!
请注意,在以前的版本中似乎存在问题(与 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) = <!> gt;移动一个 。目录
(2) FileUtils.moveDirectoryToDirectory(File src,File destDir,boolean createDestDir) = <!> gt;将目录移动到另一个目录。
(3) FileUtils.moveFile(File srcFile,File destFile) = <!> gt;移动文件。
(4) FileUtils.moveFileToDirectory(File srcFile,File destDir,boolean createDestDir) = <!> gt;将文件移动到目录。
(5) FileUtils.moveToDirectory(File src,File destDir,boolean createDestDir) = <!> gt;将文件或目录移动到目标 。目录
简单,容易和快速。
有趣的观察: 试图通过各种java类复制相同的文件,并以纳秒为单位打印时间。
使用FileOutputStream字节流的持续时间:4 965 078
使用BufferedOutputStream的持续时间:1 237 206
持续时间使用(字符文本阅读器:2 858 875
使用BufferedReader的持续时间(缓冲字符文本流:1 998 005
持续时间使用(文件NIO副本):18 351 115
使用Files Nio复制选项时,花了近18倍!!! Nio是复制文件的最慢选项,而BufferedOutputStream看起来最快。我为每个类使用了相同的简单文本文件。