2013-04-30 62 views
1

我有麻煩,因爲我需要關閉德CIS(或我不會得到最後的16個字節),但我不能,因爲我用它通過套接字:替代關閉CipherInputStream

cis = new CipherInputStream(new ObjectInputStream(socket.getInputStream)); 

(不完全是這樣,但它是如何構造的)。

所以,如果我關閉套接字,然後程序會嘗試使用它,我得到一個例外吧...

非常感謝!

+0

可能的重複[我如何強制CipherOutputStream完成加密但保持基礎流打開?](http://stackoverflow.com/questions/5449103/how-can-i-force-a-cipheroutputstream-to -finish-encrypting-but-leave-the-underlyi) – Gamb 2013-04-30 17:20:06

+0

n,它不是重複的,問題是使用sipherinputstream而不是outputstream – besnico 2013-04-30 18:48:44

+1

如果關閉CIS,您必須已經+讀取最後的256個字節,因爲您確定可以'之後再拿到它們。這裏有什麼問題? – EJP 2013-04-30 23:50:24

回答

1

您不需要關閉CipherInputStream即可讀取最後一塊數據。這沒有任何意義。

發生了什麼事是您的CipherInputStream已經讀取了最終密文塊中的所有數據,但在基礎數據流的read()調用中被阻止。流末尾的檢測觸發CipherInputStream在其密碼上調用doFinal()而不是update()。通常情況下,會發生這種情況,因爲已經到達流的末端,在您的情況下,因爲套接字已關閉。

如果您想避免關閉套接字,您需要知道密文的長度。這可能來自HTTP頭或您創建的其他一些傳輸加密數據的協議。

擴展FilterInputStream與跟蹤多少字節已經被消耗一類(不要忘了skip()法),並返回-1從read()方法時密文的規定長度已被讀取。覆蓋派生類中的close()方法,以便它不關閉基礎流。

+0

這是非常徹底的,但是,我不相信我擁有技能,也沒有時間考慮這樣的策略,儘管完全理解它並且工作的確定性 – besnico 2013-05-01 01:12:31

+0

我不能擔保Apache Commons,但[他們聲稱完全提供這種功能。](http:// commons .apache.org/proper/commons-io/apidocs/org/apache/commons/io/input/BoundedInputStream.html) – erickson 2013-05-01 01:16:53

+0

我想要看看 – besnico 2013-05-01 01:22:11