Java递归文件复制优化

时间:2014-02-18 08:20:23

标签: java file pdf optimization copy

我有一个小应用程序将PDF文件(子文件夹)复制到目标文件夹。但它工作得很慢,我想优化它。你能救我吗?

代码:

    public void pdfFolderCopy(File src, File dest)
            throws IOException {
        if (src.isDirectory()) {
            if (!dest.exists()) {
                dest.mkdir();
            }
            String files[] = src.list();
            for (String file : files) {
                File srcFile = new File(src, file);
                File destFile = new File(dest, file);
                pdfFolderCopy(srcFile, destFile);
            }
        } else {
            if (!dest.exists()) {
                System.out.println("Copying: " + src);
                //Use the Apache IO copyFile method:
                FileUtils.copyFile(src, dest);
            }
        }
    }

如果每个文件都已存在,则运行大约一分半钟。大约5分钟,如果我们需要复制大约500个文件。

2 个答案:

答案 0 :(得分:2)

代码中唯一真正耗时的任务是FileUtils.copyFile()。必要的时间将根据要复制的文件数量及其大小而增长。

关于您的代码,我建议提取dest目录的检查,因为它在复制过程中不应该更改。在开始dest之前检查并创建pdfFolderCopy目录。

答案 1 :(得分:1)

我试着简单地调用一个正在进行的过程

/bin/cp -R -n src dest

其中-R表示递归,-n表示不会覆盖。操作系统很有可能比您更快地完成此操作。不知道对于Windows或其他操作系统的相应命令是什么。

为此你需要

new ProcessBuilder()
.command("/bin/cp", "-R", "-n", src.toString(), dest.toString())
.start();

如果你想用Java做,我会尝试一些小的改动:

  • dest.mkdir()没有任何检查工作,可能会更快一点
  • listFiles可能比手动编写它们更快(可能不相关)
  • 一旦您自己创建了dest文件夹,就不需要检查是否有任何预先存在的文件

我想,多线程可能会带来很好的加速:让主线程创建复制作业并将它们提交给某些执行程序(有4-8个线程)。

请注意,这种多线程写入可能会导致更高的磁盘碎片,但我不在乎。如果必须,那么我将创建文件重定位作业,让它们返回文件内容(n * 100 KB就是什么),并使用单个编写器线程。