使用流解密和解压缩以限制内存使用?

我有一个非常大的zip文件,2.5gb,是加密的。 我无法将整个文件解密到内存中并解压缩到那里进行生产。 所以我试图使用流来限制使用的内存量。

我已经连接了以下内容(为了清晰起见,error handling和流关闭):

SecretKeySpec keySpec = new SecretKeySpec(myKey "AES"); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); FileInputStream fis = new FileInputStream(new File(pathToEncryptedFile)); CipherInputStream cis = new CipherInputStream(fis, cipher); ZipInputStream zis = new ZipInputStream(new BufferedInputStream(cis)); ZipEntry ze = null; while ((ze = zis.getNextEntry()) != null) { String filename = ze.getName(); System.out.println("Found zip entry: " + filename); } 

这适用于大约50%的文件,即使它们都以相同的方式压缩和加密。 我将在解压缩部分的while()循环中获得exception:

 java.util.zip.ZipException: unknown format (EXTSIG=f23f1090) at java.util.zip.ZipInputStream.readAndVerifyDataDescriptor(ZipInputStream.java:196) ... 

如果我将整个文件解密为字节缓冲区并将其写入磁盘,则在文件上使用ZipInputStream,它适用于我的所有测试文件。

看起来加密文件末尾的额外填充在尝试使用流时会引起一些问题,但我认为“PKCS5Padding”规范会解决这个问题。

谢谢

解密文件上使用ZipInputStream 而不将其读入内存。 如果失败,则无法读取您的文件,并且需要重新创建(可能是稍微不标准)。 如果成功,则写出解密流的结果(在将其传递给ZipInputStream之前)并检查二进制差异。