【问题标题】:Java - Zip output stream dynamic buffer sizeJava - Zip 输出流动态缓冲区大小
【发布时间】:2012-02-06 18:56:38
【问题描述】:

我正在开发从一个 zip 中获取文件并将它们放入另一个中的应用程序,它对文件很好,但如果源 zip 中有一个目录,它会失败,并出现以下异常:

Exception in thread "main" java.util.zip.ZipException: invalid entry size (expected 1374 but got 1024 bytes)

我正在使用以下代码:

public static void ZipExtractToZip(File inZip, File outZip) throws IOException
{
    ZipInputStream zis = new ZipInputStream(new FileInputStream(inZip));
    ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(outZip)));
    byte[] buffer = new byte[1024];

    for (ZipEntry ze = zis.getNextEntry(); ze != null; ze = zis.getNextEntry()) 
    {
        zos.putNextEntry(ze);
        for (int read = zis.read(buffer); read != -1; read = zis.read(buffer)) {
            zos.write(buffer, 0, read);
        }
        zos.closeEntry();
    }

    zos.close();
    zis.close();
}

我尝试了不同的缓冲区大小,但这无济于事,我需要一种获取动态缓冲区大小的方法。 欢迎提供示例和链接。

编辑:我更改了代码以使其可用

【问题讨论】:

  • 哪一行有异常?顺便说一句:我也会使用 BufferedInputSTream(不是说它会解决问题)
  • 在 java.util.zip.ZipOutputStream.closeEntry(Unknown Source) at com.hachisoftware.mmi.system.Util.ZipExtractToZip(Util.java:26)

标签: java zip zipinputstream zipoutputstream


【解决方案1】:

移动

zos.closeEntry();

在最内层循环之外,否则您假设每个条目的长度不超过 1024 字节。

我猜你的目录是第一个具有这种大小的条目。


顺便说一句,你也可以移动

byte[] buffer = new byte[1024];

到外循环之前,所以它只被创建一次。

【讨论】:

  • 谢谢,这行得通,我得到了一点压缩(1kb),但没关系
  • 另外,如果你这样做,你只需要在外循环之外创建一次缓冲区。
  • 如果我要降低缓冲区大小,压缩 zip 会更多吗?
  • 流有自己的缓冲区,默认为 512 字节。它不应该对压缩比有任何影响,只有性能。对于普通磁盘流,8K-64K 的缓冲区会稍微快一些,但是在您的情况下,我怀疑它是否重要(因为压缩/解压缩是最昂贵的)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-12
相关资源
最近更新 更多