我在收到JProgressBar
以顯示HTTP下載的狀態時出現了一個小問題。
進度條的工作,但它太快填滿並最終被相當量的過沖的最大值,如下圖所示:Java BufferedInputStream進度條
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()
實際返回文件中的字節或其他值?我假設前者來自Java 7 API,但它不符合我的發現。
我在2.69MB文件上測試這個片段。
這是從的println語句的輸出(最後幾行)
字節下載:371525502出2821490個
字節下載的:371525526出2821490個
字節下載的:371525631出2821490個
字節下載:371525788出2821490個
字節下載的:371526028出2821490個
字節下載的:371526222出2821490個
字節下載的:371526442出2821490
個 字節下載:371526697出2821490個
字節下載的:371526914出2821490
現在我知道2821490
是2.69MB的正確字節值,所以後來我的問題是,爲什麼是的read()
功能BufferedInputStream將文件讀取字節的結尾顯示爲371526914
,如果這確實是字節,那麼等於大約350MB,該文件顯然不是!
任何想法?
爲什麼你不使用BufferedInputStream#read(byte [] b,int off,int len)?它更高性能,因爲您可以同時讀取多個字節,並且通過返回讀取的字節數來表現您期望的方式。 – 2013-02-09 03:05:34
@Cyrille卡曼:我的想法正是如此。這就像用霰彈槍來獵取麻雀。 – 2013-02-09 03:14:04
沒有真正看太多的選擇,因爲我認爲我讀的地方,它可能會阻止填滿緩衝區。猜猜這是錯誤的,只是查看了它的API,我現在就實現它。感謝您的建議! – Antix 2013-02-09 03:18:46