Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用流来解密和解压以限制内存使用?_Java_Android_Encryption_Cryptography_Zip - Fatal编程技术网

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

Java 使用流来解密和解压以限制内存使用?,java,android,encryption,cryptography,zip,Java,Android,Encryption,Cryptography,Zip,我有一个非常大的zip文件,2.5gb,是加密的。我无法将整个文件解密到内存中,并在那里解压以进行生产。所以我尝试使用流来限制内存的使用量 为了实现这一点,我连接了以下内容(为了清晰起见,省略了错误处理和流关闭): 这适用于我大约50%的文件,即使它们都以相同的方式压缩和加密。对于解压缩部分,我将在while()循环中得到一个异常: java.util.zip.ZipException: unknown format (EXTSIG=f23f1090) at java.util.zip.Zi

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

为了实现这一点,我连接了以下内容(为了清晰起见,省略了错误处理和流关闭):

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

java.util.zip.ZipException: unknown format (EXTSIG=f23f1090)
  at java.util.zip.ZipInputStream.readAndVerifyDataDescriptor(ZipInputStream.java:196)
  ...
如果我将整个文件解密到字节缓冲区并将其写入磁盘,然后对该文件使用ZipInputStream,那么它适用于我的所有测试文件

在尝试使用流时,加密文件末尾的额外填充似乎会导致一些问题,但我认为“PKCS5Padding”规范会解决这些问题


谢谢

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

AFAIK Zip文件应该是可查找的,假设他们在最后有目录索引-你有没有尝试在同一个文件上运行相同的代码而不加密?@TassosBassoukos我不确定我是否理解你的意思-但是相同的解密文件在使用ZipFile(完全读入内存)时可以完美地解压,但是ZipInputStream会失败。是的,解密到一个文件,然后将文件馈送到ZipInputStream就可以了。我觉得这和填充物有关。如果输出长度不是16的倍数,则加密方法服务器端会在末尾添加一些填充。当试图通过流执行所有操作时,这可能会打乱操作?zip存档的完整目录位于文件的末尾,因此如果剩余的填充将导致问题。如果作为流进行访问,目录是否位于末尾是否重要?ZipInputStream只是从头到尾读取条目。异常是在提取了一些条目后引发的。好吧,结果表明它与解密无关。我从工作流中删除了它。ZipInputStream在我的一些拉链上失败了,ZipFile每次都能工作。我尝试了apache的ZipArchiveInputStream,它可以处理ZipInputStream无法处理的问题。
java.util.zip.ZipException: unknown format (EXTSIG=f23f1090)
  at java.util.zip.ZipInputStream.readAndVerifyDataDescriptor(ZipInputStream.java:196)
  ...