我有一个小应用程序将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个文件。
答案 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就是什么),并使用单个编写器线程。