1

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

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

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

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

非常感谢!

4

1 回答 1

1

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

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

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

FilterInputStream使用一个跟踪已消耗字节数的类进行扩展(不要忘记该方法),并在读取指定长度的密文时skip()从该方法返回 -1 。read()覆盖close()派生类中的方法,使其不会关闭基础流。

于 2013-05-01T01:07:20.317 回答