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



有人知道如何为Apache的FileUtils.copyDirectory(File src, File dst)实现进度条吗?我认为JavaDocs和API没有任何帮助。这似乎是处理批处理磁盘操作的常见用例,所以我不确定是否遗漏了一些明显的内容。

我想你必须自己做。我看到了这个立竿见影的解决方案:

  1. 查找要复制的所有文件,并首先计算文件的数量或总大小(取决于进度条的大小)
  2. 使用FileUtils.copyDirectory(File, File, FileFilter)复制文件,并"滥用"FileFilter作为回调,将进度通知进度条

对于任何感兴趣的人来说,我通过处理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值和正在复制的文件的总大小):

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

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

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

相关内容

  • 没有找到相关文章

最新更新