71

是否有一个标准的 Java 库来处理常见的文件操作,例如移动/复制文件/文件夹?

4

7 回答 7

73

以下是如何通过操作执行此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();
        }
    }
}
于 2009-05-26T07:28:27.570 回答
41

目前还没有,但New NIO (JSR 203)将支持这些常见操作。

与此同时,有几件事情要记住。

File.renameTo通常仅适用于同一文件系统卷。我认为这相当于“mv”命令。如果可以,请使用它,但对于一般的复制和移动支持,您需要有一个后备。

当重命名不起作用时,您将需要实际复制文件(如果它是“移动”操作,则使用File.delete删除原始文件)。要以最高效率执行此操作,请使用FileChannel.transferToFileChannel.transferFrom方法。该实现是特定于平台的,但通常,当从一个文件复制到另一个文件时,实现避免在内核和用户空间之间来回传输数据,从而大大提高了效率。

于 2008-11-18T23:38:12.813 回答
17

查看: http ://commons.apache.org/io/

它有副本,并且如前所述,JDK 已经移动。

不要实现自己的复制方法。有这么多漂浮在那里...

于 2008-11-18T23:41:43.710 回答
10

以前的答案似乎已经过时了。

Java 的File.renameTo()可能是 API 7 最简单的解决方案,而且似乎工作正常。小心它不会抛出异常,而是返回真/假!!!

请注意,在以前的版本中似乎存在问题(与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);
于 2012-06-06T13:02:34.477 回答
8

Google 的 Guava 库也有这些:

http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/io/Files.html

于 2010-07-05T16:14:13.430 回答
7

尝试使用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) => 将文件或目录移动到目标目录。

它简单、容易、快速。

于 2013-02-01T12:54:17.130 回答
0

有趣的观察:试图通过各种 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 看起来是最快的。我对每个类都使用了相同的简单文本文件。

于 2017-01-09T09:43:44.593 回答