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

Java 带有Apache FileUtils.copyDirectory(…)的进度条,java,apache-commons,apache-commons-io,fileutils,Java,Apache Commons,Apache Commons Io,Fileutils,有人知道为Apache的FileUtils.copyDirectory(文件src,文件dst)实现进度条的方法吗?我在和API中看不到任何有用的东西。似乎是处理批处理磁盘操作的常见用例,因此我不确定是否遗漏了一些明显的内容。我想您必须自己完成这项工作。我认为这是一个立竿见影的解决办法: 找到要复制的所有文件,然后首先计算数量或总文件大小(取决于进度条应测量的内容) 使用FileFilter作为回调来复制文件,并将其“滥用”,以将进度告知进度栏 对于任何感兴趣的人,我都是通过处理FileUtil

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

我想您必须自己完成这项工作。我认为这是一个立竿见影的解决办法:

  • 找到要复制的所有文件,然后首先计算数量或总文件大小(取决于进度条应测量的内容)
  • 使用
    FileFilter
    作为回调来复制文件,并将其“滥用”,以将进度告知进度栏

  • 对于任何感兴趣的人,我都是通过处理FileUtils中的
    doCopyFile
    方法以及由此产生的两种方法来实现的。然后我将它们粘贴到一个新类中,这样我就可以编辑这些方法,而不仅仅是使用固定的FileUtils方法

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

    pos += output.transferFrom(input, pos, count);
    
    对此:(每次清空缓冲区时更新进度条,这不是最好的方法)


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

    然后使用以下内容更新EDT fire事件上的进度条:

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

    是的,我想
    FileFilter
    可以做到这一点。讨厌,但工作和更好,然后重写整个方法,所以我会接受它随时:)
    long bytesTransfered = output.transferFrom(input, pos, count);
    pos += bytesTransfered;
    bytesTransferedTotal += bytesTransfered;
    
    ProgressBar.setValue((int) Math.floor((100.0 / totalSizeOfFiles) * bytesTransferedTotal));