有人知道如何为Apache的FileUtils.copyDirectory(File src, File dst)
实现进度条吗?我认为JavaDocs和API没有任何帮助。这似乎是处理批处理磁盘操作的常见用例,所以我不确定是否遗漏了一些明显的内容。
我想你必须自己做。我看到了这个立竿见影的解决方案:
- 查找要复制的所有文件,并首先计算文件的数量或总大小(取决于进度条的大小)
- 使用
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));