我需要通过 Java 类 ZipOutputStream 压缩一个大文件(~450 MB)。这个大尺寸导致我的 JVM 堆空间出现“OutOfMemory”错误问题。发生这种情况是因为“zos.write(...)”方法在压缩之前将要压缩的所有文件内容存储在内部字节数组中。
origin = new BufferedInputStream(fi, BUFFER);
ZipEntry entry = new ZipEntry(filePath);
zos.putNextEntry(entry);
int count;
while ((count = origin.read(data, 0, BUFFER)) != -1)
{
zos.write(data, 0, count);
}
origin.close();
自然的解决方案是扩大JVM的堆内存空间,但我想知道是否有一种方法可以以流式方式写入这些数据。我不需要高压缩率,所以我也可以改变算法。
有人对此有什么想法吗?
根据您对 Sam 回复的评论,您显然创建了一个 ZipOutputStream,它包装了 ByteArrayOutputStream。 ByteArrayOutputStream 当然将压缩结果缓存在内存中。如果您希望将其写入磁盘,则必须将 ZipOutputStream 包装在 FileOutputStream 周围。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)