我有麻煩,因爲我需要關閉德CIS(或我不會得到最後的16個字節),但我不能,因爲我用它通過套接字:替代關閉CipherInputStream
cis = new CipherInputStream(new ObjectInputStream(socket.getInputStream));
(不完全是這樣,但它是如何構造的)。
所以,如果我關閉套接字,然後程序會嘗試使用它,我得到一個例外吧...
非常感謝!
我有麻煩,因爲我需要關閉德CIS(或我不會得到最後的16個字節),但我不能,因爲我用它通過套接字:替代關閉CipherInputStream
cis = new CipherInputStream(new ObjectInputStream(socket.getInputStream));
(不完全是這樣,但它是如何構造的)。
所以,如果我關閉套接字,然後程序會嘗試使用它,我得到一個例外吧...
非常感謝!
您不需要關閉CipherInputStream
即可讀取最後一塊數據。這沒有任何意義。
發生了什麼事是您的CipherInputStream
已經讀取了最終密文塊中的所有數據,但在基礎數據流的read()
調用中被阻止。流末尾的檢測觸發CipherInputStream
在其密碼上調用doFinal()
而不是update()
。通常情況下,會發生這種情況,因爲已經到達流的末端,在您的情況下,因爲套接字已關閉。
如果您想避免關閉套接字,您需要知道密文的長度。這可能來自HTTP頭或您創建的其他一些傳輸加密數據的協議。
擴展FilterInputStream
與跟蹤多少字節已經被消耗一類(不要忘了skip()
法),並返回-1從read()
方法時密文的規定長度已被讀取。覆蓋派生類中的close()
方法,以便它不關閉基礎流。
可能的重複[我如何強制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
n,它不是重複的,問題是使用sipherinputstream而不是outputstream – besnico 2013-04-30 18:48:44
如果關閉CIS,您必須已經+讀取最後的256個字節,因爲您確定可以'之後再拿到它們。這裏有什麼問題? – EJP 2013-04-30 23:50:24