5

ファイルのコピー操作を実行し、ユーザーに進行状況バーを表示する必要がある Web アプリケーションがあります。

現在、コピーは呼び出しによって行われていますが、cpioこれは操作が完了するまで Java コードを進行させることができません。Java を使用して書き込みバイト数と読み取りバイト数を監視し、コピーの進行状況を推定することは可能ですが、実際のコピー操作を Java でコーディングすると、より簡単な解決策があると思います。cpioアーカイブ目的で引き続き使用しますが、実際のコピーは Java クラスによって実行されます。

検索で見つけたヘルプのほとんどは、swing コンポーネントを組み込んだ progressMonitor に関連したものでした。必要なのは、Web アプリケーションのプログレス バー コンポーネントに 100 分の 1 としてフィードできる進行状況の整数/倍数だけです。

4

2 に答える 2

7

Java でファイルをコピーし、コマンドラインで進行状況を監視する方法は次のとおりです。

import java.io.*;

public class FileCopyProgress {
    public static void main(String[] args) {
        System.out.println("copying file");
        File filein  = new File("test.big");
        File fileout = new File("test_out.big");
        FileInputStream  fin  = null;
        FileOutputStream fout = null;
        long length  = filein.length();
        long counter = 0;
        int r = 0;
        byte[] b = new byte[1024];
        try {
                fin  = new FileInputStream(filein);
                fout = new FileOutputStream(fileout);
                while( (r = fin.read(b)) != -1) {
                        counter += r;
                        System.out.println( 1.0 * counter / length );
                        fout.write(b, 0, r);
                }
        }
        catch(Exception e){
                System.out.println("foo");
        }
    }
}

の代わりにプログレスバーを何らかの方法で更新する必要があります System.out.println()。これが役に立てば幸いですが、あなたの質問が理解できなかったかもしれません。

于 2012-06-25T02:12:11.123 に答える
1

基本的には、リスナー パターンを使用する必要があります。この例では、リスナーには、書き込まれたばかりのバイト数を受け入れる単一のメソッドがあります。画面に表示するパーセンテージを計算するために、ファイルの合計サイズを事前に入力することができます。

ReadableByteChannel source = ...;
WritableByteChannel dest = ...;
FileCopyListener listener = ...;


ByteBuffer buf = ByteBuffer.allocateDirect(BUFFER_SIZE);
while (src.read(buf) != -1) {
  buf.flip();
  int writeCount = dest.write(buf);
  listener.bytesWritten(writeCount);
  buf.compact();
}
buf.flip();
while (buffer.hasRemaining()) {
  int writeCount = dest.write(buf);
  listener.bytesWritten(writeCount);
}
于 2012-06-25T03:05:37.703 に答える