有谁知道为Apache的FileUtils.copyDirectory(File src, File dst)
实现进度条的任何方式?我在JavaDocs和API中看不到任何有用的内容。这似乎是处理批量磁盘操作的常见用例,因此我不确定是否会遗漏一些明显的内容。
答案 0 :(得分:5)
我想你必须自己做。我看到了这个直接的解决方案:
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));