有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

带有ApacheFileUtils的java进度条。copyDirectory(…)

有人知道为Apache的FileUtils.copyDirectory(File src, File dst)实现进度条的方法吗?我在JavaDocs和API中看不到任何有用的东西。似乎是处理批处理磁盘操作的常见用例,所以我不确定是否遗漏了一些明显的东西


共 (2) 个答案

  1. # 1 楼答案

    对于任何感兴趣的人,我都是通过处理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 fire事件的进度条:

    ProgressBar.setValue((int) Math.floor((100.0 / totalSizeOfFiles) * bytesTransferedTotal));
    
  2. # 2 楼答案

    我想你得自己做。我认为这是一个立竿见影的解决方案:

    1. 找到要复制的所有文件,然后首先计算文件的数量或总大小(取决于进度条应测量的内容)
    2. 使用^{}FileFilter作为回调来复制文件,以便将进度传达给进度条