Java 关闭加密流的替代方法

Java 关闭加密流的替代方法,java,inputstream,encryption,objectinputstream,Java,Inputstream,Encryption,Objectinputstream,我遇到问题是因为我需要关闭de CIS(或者我无法获取最后16个字节),但我不能,因为我正在通过套接字使用它: cis = new CipherInputStream(new ObjectInputStream(socket.getInputStream)); (不完全是这样,但它是如何构造的) 所以,如果我关闭套接字,程序就会尝试使用它,我会得到一个异常 非常感谢 读取最后一个数据块时,无需关闭CipherInputStream。那没有任何意义 发生的情况是,CipherInputStrea

我遇到问题是因为我需要关闭de CIS(或者我无法获取最后16个字节),但我不能,因为我正在通过套接字使用它:

cis = new CipherInputStream(new ObjectInputStream(socket.getInputStream));
(不完全是这样,但它是如何构造的)

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


非常感谢

读取最后一个数据块时,无需关闭
CipherInputStream
。那没有任何意义

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

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


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

无需关闭
CipherInputStream来读取最后一块数据。那没有任何意义

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

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


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

npe可能重复,但不是重复,问题在于SIPHERIPUTSRUM not OUTPUTSTREAM如果关闭CI,则必须先+已+读取最后256个字节,因为之后肯定无法获取它们。这里的问题是什么?问题是我无法关闭CI,或者它将关闭与该CI关联的所有流(具有相同套接字),并且我仍然希望对其执行RED/写入。它也不会写入/读取文件的最后16个字节…顺便说一句,我更正了这个问题,我的意思是16而不是256。。。Sorry npe可能重复,不是重复,问题在于sipherinputstream not OutputStream如果关闭CI,您必须已经+读取了最后256个字节,因为之后肯定无法获取它们。这里的问题是什么?问题是我无法关闭CI,或者它将关闭与该CI关联的所有流(具有相同套接字),并且我仍然希望对其执行RED/写入。它也不会写入/读取文件的最后16个字节…顺便说一句,我更正了这个问题,我的意思是16而不是256。。。对不起,这是非常彻底的,但是,我不相信我有足够的技能也没有时间考虑这样的策略,尽管我完全理解它并且它肯定会工作,我不能保证Apache Commons,但是我想我必须仔细研究这一点,然而,这是非常彻底的,我不相信我有足够的技能和时间来考虑这样的策略,尽管我完全理解它,而且它肯定会工作,我不能保证Apache Commons,但我想我必须研究一下