2010-07-02 88 views
0

我想大致監視文件上傳的進度。我知道我可以重寫MultipartEntity並將writeTo(OutputStream out)方法寫入到我創建的FilterOutputStream類中以包裝默認的InputStream。有關我如何做的完整細節,請參閱我的回答here如何正確擴展Java FilterOutputStream類?

但是,仔細檢查後,這會計算每個發送兩次的字節!我去了文檔,看看發生了什麼。看起來FilterOutputStream的write(byte[], int, int)方法只是在一個循環中調用FilterOutputStream的write(byte)方法。它建議子類提供更有效的方法。我會假設這涉及調用底層OutputStream的寫(byte [],int,int),並希望底層OutputStream有一個更好的方法將字節推送到流上(Doc的推薦子類OutputStream覆蓋此方法並做得更​​好而不是簡單地遍歷OutputStream#write(byte)方法)。

這是我發現自己陷入困境的地方。我不能保證MultipartEntity#writeTo(OutputStream)總是會調用OutputStream.write(byte [],int,int),所以如果我計算在那裏發送的字節,那麼我可能會錯過一些使用寫(字節)方法。但是,我無法計入write(byte)方法,因爲OutputStream.write(byte [],int,int)方法可能永遠不會調用write(byte)方法。

一個答案是在我的子類的write(byte [],int,int)方法內部調用super.write(byte [],int,int)。然後,我知道這將簡單地循環寫入(字節)方法,一次寫入一個字節。然後,我可以計算寫入(字節)方法內寫入的所有字節。但是,這是低效的,文檔直接建議不要。我確信OutputStream的一些子類可以一次寫入多個字節到流中,所以使用這個優點是愚蠢的。

那麼,我該如何正確地重寫FilterOutputStream以便高效並計算所有發送的字節呢?

很抱歉,如果這是漫長的,我已萬一有人維基可以說明問題比一

+0

http://www.karlin.mff.cuni.cz/network/prirucky/javatut/java/io/writingFiltered.html – Val 2013-09-18 13:09:29

回答

3

就叫write(byte[] b, int off, int len)底層流上時相同的方法被調用的計數流。這絕不會導致調用計數流上的write(byte b)方法。

另外,鏈接答案中的CountingOutputStream還有其他一些問題。

  1. 它有自己的參考包裹的輸出流,即使FilterOutputStream商店爲你在一個受保護的領域被稱爲out
  2. 當調用write(byte[] b, int off, int len)時,它會將len字節寫入包裝流中,但僅將傳輸的字節數加1。
  3. 它不增加在write(byte b)中傳輸的字節。
+0

Colin,非常感謝!這使得它更清晰:) – Hamy 2010-07-03 20:16:37