Apache FileUtils.copyDirectory(...)的进度条

时间:2012-07-11 07:05:36

标签: java apache-commons apache-commons-io fileutils

有谁知道为Apache的FileUtils.copyDirectory(File src, File dst)实现进度条的任何方式?我在JavaDocs和API中看不到任何有用的内容。这似乎是处理批量磁盘操作的常见用例,因此我不确定是否会遗漏一些明显的内容。

2 个答案:

答案 0 :(得分:5)

我想你必须自己做。我看到了这个直接的解决方案:

  1. 找到您要复制的所有文件,并首先计算数字或总文件大小(取决于您的进度条应衡量的内容)
  2. 使用FileUtils.copyDirectory(File, File, FileFilter)复制文件并“滥用”FileFilter作为回调以将进度传达到进度条

答案 1 :(得分:2)

对于任何有兴趣的人,我通过处理FileUtils中的doCopyFile方法和导致它的几种方法来做到这一点。然后我将它们粘贴到一个新类中,以便我可以编辑方法而不是仅使用固定的FileUtils方法。

然后我改变了doCopyFile方法的这一部分:

pos += output.transferFrom(input, pos, count);

对此:(每次清空缓冲区时更新进度条,而不是最佳方式)

//Split into into deceleration and assignment to count bytes transfered
long bytesTransfered = output.transferFrom(input, pos, count);
//complete original method
pos += bytesTransfered;
//update total bytes copied, so it can be used to calculate progress
bytesTransferedTotal += bytesTransfered;
//your code to update progress bar here
ProgressBar.setValue((int) Math.floor((100.0 / totalSize) * bytesTransferedTotal));

为了更好的方式,副本将在不同的线程中运行,并且进度条将在EDT中更新(使用bytesTransfered值和正在复制的文件的总大小):< / p>

long bytesTransfered = output.transferFrom(input, pos, count);
pos += bytesTransfered;
bytesTransferedTotal += bytesTransfered;

然后用以下内容更新EDT火灾事件的进度条:

ProgressBar.setValue((int) Math.floor((100.0 / totalSizeOfFiles) * bytesTransferedTotal));