【问题标题】:How to read a CipherInputStream correctly?如何正确读取 CipherInputStream?
【发布时间】:2013-11-08 13:39:59
【问题描述】:

我有一个使用 CipherOutputStream 加密的文件(使用 AES 密钥)。加密工作完美。 现在我想解密这个文件并保存为另一个文件。我正在使用两个流来做到这一点。使用适当的密钥数据从 FileInputStream 初始化 CipherInputStream,从文件名初始化 FileOutputStream。我用这种方法复制文件:

private static void copyStreams(InputStream is, OutputStream os) throws IOException {
    byte[] buffer = new byte[1024 * 10];
    int length;
    while ((length = is.read(buffer)) > 0) {
        os.write(buffer, 0, length);
    }
}

问题:length 总是等于缓冲区长度(如果文件大于缓冲区)。因此它永远不会结束。这是一个无限循环。

我认为问题在于我检测输入流结束的方式。 我应该如何正确地将一个流复制到另一个流?

提前致谢!

【问题讨论】:

  • 这对我来说很好 - 你确定它真的 always 返回一个大数字吗?我希望它可以根据需要循环多次,然后停止。你能发布一个简短但完整的程序来演示这个问题吗?
  • 非常感谢。我发现了问题。问题出在我身上,而不是上面的代码。我在一个非常慢的文件系统(一个较旧的 Android 平板电脑)上运行它,因此它花费了非常多的时间。出于这个原因,我认为它会无限运行。现在我将缓冲区大小增加到 10MBytes,它现在已经足够快了。我不知道,我应该要求版主删除我的问题吗?感觉自己很蠢。
  • @ÁronNemmondommegavezetéknevem 您可以删除自己的问题,因为它没有答案。如果问题 (a) 有多个答案,或 (b) 有一个答案得分为正,您将无法删除问题。见meta.stackexchange.com/questions/5221/…

标签: java encryption inputstream


【解决方案1】:

InputStreamread 方法可以返回 0,表示没有读取任何字节,尽管下一次调用 read 可能会返回更多字节。您的情况应该反映这一点。

while ((length = is.read(buffer)) >= 0) {
        os.write(buffer, 0, length);
}

【讨论】:

    猜你喜欢
    • 2020-06-19
    • 1970-01-01
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    • 1970-01-01
    • 2017-11-26
    • 1970-01-01
    相关资源
    最近更新 更多