是否有一个标准的Java库可以处理常见的文件操作,例如移动/复制文件/文件夹?
Answers:
这是通过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();
}
}
}
File.renameTo
不如Files.move
?
Files.move
将告诉您原因,而不是简单地返回false
。并且Files.move
可以处理不是简单重命名的移动,即需要复制和删除。
尚未,但是New NIO(JSR 203)将支持这些常见操作。
同时,有几点需要牢记。
File.renameTo通常仅适用于同一文件系统卷。我认为这等效于“ mv”命令。如果可以的话,请使用它,但要获得常规的复制和移动支持,您将需要一个备用。
当重命名不起作用时,您将需要实际复制文件(如果是“移动”操作,则使用File.delete删除原始文件)。若要以最大的效率执行此操作,请使用FileChannel.transferTo或FileChannel.transferFrom方法。该实现是特定于平台的,但是通常,从一个文件复制到另一个文件时,实现避免在内核空间和用户空间之间来回传输数据,从而大大提高了效率。
Never implement your own utilities when there are quality libraries out there.
嗯,如果您永远不必担心许可问题。
先前的答案似乎已过时。
Java的File.renameTo()可能是API 7最简单的解决方案,并且似乎工作正常。请注意,它不会抛出异常,但会返回true / false!
请注意,在以前的版本中似乎存在问题(与NIO相同))中。
如果您需要使用以前的版本,请在此处检查。
这是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);
Google的Guava库还具有以下功能:
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字节流的持续时间:4 965 078
使用BufferedOutputStream的持续时间:1 237 206
使用的持续时间(字符文本阅读器:2 858 875
使用BufferedReader的持续时间(缓冲字符文本流:1 998 005
使用的持续时间(文件NIO副本):18351115
当使用文件Nio复制选项时,它花费了将近18倍的时间!Nio是复制文件的最慢选项,而BufferedOutputStream看起来是最快的。我为每个班级使用了相同的简单文本文件。