用Java移动/复制文件操作

时间:2008-11-18 23:34:39

标签: java file copy move

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

7 个答案:

答案 0 :(得分:72)

以下是使用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();
        }
    }
}

答案 1 :(得分:40)

尚未,但New NIO (JSR 203)将支持这些常见操作。

与此同时,还有一些事情需要牢记。

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

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

答案 2 :(得分:17)

退房: http://commons.apache.org/io/

它有副本,如上所述,JDK已经移动了。

不要实施自己的复制方法。那里有很多漂浮......

答案 3 :(得分:10)

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

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

请注意,在以前的版本中似乎存在问题(与NIO相同)。

如果您需要使用以前的版本,请检查here

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

答案 4 :(得分:8)

答案 5 :(得分:7)

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

简单,容易和快速。

答案 6 :(得分: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看起来最快。我为每个类使用了相同的简单文本文件。