JProgressBar
HTTPダウンロードのステータスを表示するのに少し問題があります。
以下に示すように、プログレスバーは機能していますが、いっぱいになるのが早すぎて、最終的に最大値をかなり上回ります。
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に相当します。いいえ!
何か案は?