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