我想大致監視文件上傳的進度。我知道我可以重寫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以便高效並計算所有發送的字節呢?
很抱歉,如果這是漫長的,我已萬一有人維基可以說明問題比一
http://www.karlin.mff.cuni.cz/network/prirucky/javatut/java/io/writingFiltered.html – Val 2013-09-18 13:09:29