2013-02-09 94 views
-1

我在收到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,該文件顯然不是!

任何想法?

+2

爲什麼你不使用BufferedInputStream#read(byte [] b,int off,int len)?它更高性能,因爲您可以同時讀取多個字節,並且通過返回讀取的字節數來表現您期望的方式。 – 2013-02-09 03:05:34

+0

@Cyrille卡曼:我的想法正是如此。這就像用霰彈槍來獵取麻雀。 – 2013-02-09 03:14:04

+0

沒有真正看太多的選擇,因爲我認爲我讀的地方,它可能會阻止填滿緩衝區。猜猜這是錯誤的,只是查看了它的API,我現在就實現它。感謝您的建議! – Antix 2013-02-09 03:18:46

回答

1

我解決了這個問題,在i = in.read()執行i變量後,將數據的字節表示保存到文件中一個字節,等等,以便每次循環迭代。所以它不是讀取的字節數,它是一個字節的實際數據。

我將我的bytesDownloaded += i;更改爲bytesDownloaded++;,在調試輸出以及進度條中都給出了正確的結果。

+0

你可以從Javadoc中發現所有的東西,而不是僅僅猜測它。 – EJP 2013-02-09 09:28:40