使用Java压缩ZIP中的大文件

rob*_*bob 8 java zip large-files

我需要通过Java类ZipOutputStream压缩一个Big文件(~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();
Run Code Online (Sandbox Code Playgroud)

自然的解决方案是扩大JVM的堆内存空间,但我想知道是否有一种方法以流方式写入这些数据.我不需要高压缩率,所以我也可以改变算法.

有没有人对此有所了解?

jar*_*bjo 11

根据您对Sam的回复的评论,您显然创建了一个ZipOutputStream,它包装了一个ByteArrayOutputStream.ByteArrayOutputStream当然将压缩结果缓存在内存中.如果要将其写入磁盘,则必须将ZipOutputStream包装在FileOutputStream周围.

  • +1,使用FileOutputStream将zip写入磁盘,或者如果要将其直接流式传输到浏览器,请使用HttpServletResponse outputStream. (2认同)