5

Apacheのプログレスバーを実装する方法を知っている人はいますFileUtils.copyDirectory(File src, File dst)か?JavaDocsとAPIで役立つものは何も見当たりません。バッチディスク操作を処理する際の一般的な使用例のように思われるので、明らかなことを見逃しているかどうかはわかりません。

4

2 に答える 2

6

私はあなたがそれを自分でしなければならないだろうと思います。私はこの即時の解決策を見ます:

  1. コピーしようとしているすべてのファイルを見つけて、最初にファイルの数または合計サイズを数えます(プログレスバーが測定する内容によって異なります)
  2. を使用してファイルをコピーし、進行状況を進行状況バーに伝えるためのコールバックとしてFileUtils.copyDirectory(File, File, FileFilter)「乱用」しますFileFilter
于 2012-07-11T07:12:40.213 に答える
3

興味のある人のために、私はdoCopyFileFileUtilsのメソッドとそれにつながるいくつかのメソッドをコピーすることでこれを行いました。次に、それらを新しいクラスに貼り付けて、固定の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));
于 2013-08-30T03:57:34.393 に答える