我遇到了麻烦,因为我需要关闭de CIS(或者我不会得到最后16个字节),但我不能,因为我在套接字上使用它:
cis = new CipherInputStream(new ObjectInputStream(socket.getInputStream));
(不完全是这样,但它是如何构建的)。
所以,如果我关闭套接字,程序会尝试使用它,我会得到一个Exception ...
非常感谢!
答案 0 :(得分:1)
您无需关闭CipherInputStream
即可读取最后一个数据块。这没有任何意义。
正在发生的事情是您的CipherInputStream
已读取最终密码文本块中的所有数据,但在基础流的read()
调用中被阻止。检测到流的结尾会触发CipherInputStream
在其密码上调用doFinal()
而不是update()
。通常情况下会发生这种情况,因为在您的情况下已达到流的末尾,因为套接字已关闭。
如果要避免关闭套接字,则需要知道密文的长度。这可能来自HTTP标头,或您为传输加密数据而创建的其他协议。
使用跟踪消耗了多少字节的类扩展FilterInputStream
(不要忘记skip()
方法),并从read()
方法返回-1已读取指定长度的密文。覆盖派生类中的close()
方法,以便它不会关闭基础流。