Java 如何正确读取密码流?

Java 如何正确读取密码流?,java,encryption,inputstream,Java,Encryption,Inputstream,我有一个用CipherOutputStream加密的文件(使用AES密钥)。加密工作完美。 现在我想解密这个文件并另存为另一个文件。我用两条流来做这件事。使用适当的密钥数据从FileInputStream初始化CipherInputStream,并使用文件名初始化FileOutputStream。我使用此方法复制文件: private static void copyStreams(InputStream is, OutputStream os) throws IOException {

我有一个用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
始终等于缓冲区长度(如果文件大于缓冲区)。因此它永远不会结束。这是一个无限循环

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


提前谢谢

InputStream的
read
方法可以返回
0
指示没有读取字节,尽管下次调用
read
可能会返回更多字节。你的情况应该反映出来

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

在我看来这很好-你确定它真的总是返回一个大数字吗?我希望它能按需要转很多圈,然后停下来。你能发布一个简短但完整的程序来演示这个问题吗?非常感谢。我发现了问题所在。问题出在我身上,而不是上面的代码。我在一个非常慢的文件系统(一个旧的安卓平板电脑)上运行它,因此花了很多时间。出于这个原因,我认为它运行无限。现在我将缓冲区大小增加到10兆字节,现在速度足够快了。我不知道,我应该要求主持人删除我的问题吗?感觉自己很愚蠢。@ronNemmondommegavezetéknevem你可以删除你自己的问题,因为它没有答案。如果问题(a)有多个答案,或者(b)有一个答案得分为正,则无法删除该问题。看见