【问题标题】:Alternative to closing a CipherInputStream关闭 CipherInputStream 的替代方法
【发布时间】:2013-04-30 17:16:58
【问题描述】:

我遇到了麻烦,因为我需要关闭 de CIS(否则我将无法获得最后 16 个字节),但我无法通过套接字使用它:

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

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

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

非常感谢!

【问题讨论】:

  • npe,它不是重复的,问题在于 sipherinputstream 而不是 outputstream
  • 如果你关闭 CIS,你必须 +already+ 读取最后 256 个字节,因为之后你肯定无法得到它们。这里有什么问题?
  • 问题是我无法关闭 CIS,否则它将关闭与该 CIS 关联的所有流(具有相同的套接字),我仍然想对它们执行红色/写入。它也不会写入/读取文件的最后 16 个字节...
  • 顺便说一句,我更正了这个问题,我的意思是说 16 而不是 256...对不起

标签: java inputstream encryption objectinputstream


【解决方案1】:

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

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

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-31
  • 2011-10-13
  • 1970-01-01
  • 1970-01-01
  • 2010-09-18
  • 2013-04-04
  • 1970-01-01
相关资源
最近更新 更多