0

JProgressBarHTTPダウンロードのステータスを表示するのに少し問題があります。
以下に示すように、プログレスバーは機能していますが、いっぱいになるのが早すぎて、最終的に最大値をかなり上回ります。

public void test(InputStream stream, File location) {  
    BufferedInputStream in = new BufferedInputStream(stream);  
    FileOutputStream file = new FileOutputStream(location);  
    BufferedOutputStream out = new BufferedOutputStream(file);  
    int i;  
    int bytesDownloaded = 0;  
    while ((i = in.read()) != -1) {  
        bytesDownloaded += i;  
        out.write(i);  
        System.out.println("Bytes downloaded: " + bytesDownloaded + " out of " + len);  
        update(bytesDownloaded);  
    }
}

問題はbytesDownloaded、ファイルの最後でlenよりもはるかに大きくなってしまうことです。in.read()実際には、ファイル内の最大バイト数またはその他の値が返されますか?前者はJava7APIからのものと想定していますが、私の調査結果と一致していません。

このスニペットを2.69MBのファイルでテストしています。
これは、printlnステートメントからの出力です(最後の数行)

ダウンロードされたバイト数:3821490のうち371525502
ダウンロードされたバイト数:2821490のうち371525526
ダウンロードされたバイト数:2821490のうち371525681
ダウンロードされたバイト数:2821490のうち371525788ダウンロードされたバイト
数:2821490のうち371526228
ダウンロードされたバイト数:2821490のうち371526222ダウンロードされた バイト
数:2821490のうち371526442
ダウンロード:2821490のうち371526697ダウンロードされた
バイト:2821490から371526914

2821490これが2.69MBの正しいバイト値であることがわかったので、私の質問が残ります。なぜread()、BufferedInputStreamの関数が、ファイルの読み取りバイトの終わりをとして表示するのです371526914か。これが実際にバイトである場合、ファイルは明らかに約350MBに相当します。いいえ!

何か案は?

4

2 に答える 2

2

javax.swing.ProgressMonitorInputStreamを挿入するだけです。

于 2013-02-09T09:27:36.877 に答える
2

i = in.read() 実行後、i変数はデータのバイト表現をファイルに1バイト保持するなど、ループの繰り返しごとに解決しました。したがって、読み取ったバイト数ではなく、実際の 1 バイトのデータです。

に変更bytesDownloaded += i;bytesDownloaded++;たところ、デバッグ出力と進行状況バーの両方で正しい結果が得られました。

于 2013-02-09T02:41:24.297 に答える