Java - 动态缓冲区大小的 Zip 输出流

3

我正在处理一个应用程序,该应用程序将文件从一个zip中提取并放入另一个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();
}

我尝试了不同的缓冲区大小,但这并没有起到帮助作用,我需要一种获取动态缓冲区大小的方法。欢迎提供示例和链接。
编辑:我已更改代码以使其可用。
- 列姆,Hachi Software首席执行官

哪一行出现了异常?顺便说一句:我也会使用BufferedInputStream(虽然这不会解决问题)。 - Peter Lawrey
在 java.util.zip.ZipOutputStream.closeEntry(Unknown Source) 处 在 com.hachisoftware.mmi.system.Util.ZipExtractToZip(Util.java:26) - Liam Haworth
1个回答

3
移动
zos.closeEntry();

在最内层循环之外进行操作,否则你就假设每个条目都不超过1024字节。我猜测你的目录是第一个达到那个大小的条目。
另外,你也可以移动它。
byte[] buffer = new byte[1024];

将外层循环之前的代码移动,这样只会创建一次。

谢谢,那个有效,我得到了一点点压缩(1kb),但没关系。 - Liam Haworth
此外,如果您这样做,您只需要在外部循环之外创建缓冲区一次。 - sje397
1
如果我降低缓冲区大小,那么压缩的zip文件会更小吗? - Liam Haworth
1
流具有自己的缓冲区,默认情况下为512字节。这不应该对压缩比产生任何影响,只会影响性能。对于普通磁盘流,8K-64K的缓冲区会稍微快一些,但在您的情况下,我怀疑它并不重要(因为压缩/解压缩是最昂贵的)。 - Peter Lawrey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接