关闭CipherInputStream的替代方法

时间:2013-04-30 17:16:58

标签: java inputstream encryption objectinputstream

我遇到了麻烦,因为我需要关闭de CIS(或者我不会得到最后16个字节),但我不能,因为我在套接字上使用它:

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

(不完全是这样,但它是如何构建的)。

所以,如果我关闭套接字,程序会尝试使用它,我会得到一个Exception ...

非常感谢!

1 个答案:

答案 0 :(得分:1)

您无需关闭CipherInputStream即可读取最后一个数据块。这没有任何意义。

正在发生的事情是您的CipherInputStream已读取最终密码文本块中的所有数据,但在基础流的read()调用中被阻止。检测到流的结尾会触发CipherInputStream在其密码上调用doFinal()而不是update()。通常情况下会发生这种情况,因为在您的情况下已达到流的末尾,因为套接字已关闭。

如果要避免关闭套接字,则需要知道密文的长度。这可能来自HTTP标头,或您为传输加密数据而创建的其他协议。

使用跟踪消耗了多少字节的类扩展FilterInputStream(不要忘记skip()方法),并从read()方法返回-1已读取指定长度的密文。覆盖派生类中的close()方法,以便它不会关闭基础流。