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

时间:2012-01-10 10:46:22

标签: java zip zipinputstream zipoutputstream

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

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();
}

我尝试过不同的缓冲区大小,但这没有用,我需要一种方法来获得动态缓冲区大小。 欢迎提供示例和链接。

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

1 个答案:

答案 0 :(得分:2)

移动

zos.closeEntry();

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

我猜您的目录是该大小的第一个条目。


BTW,您也可以移动

byte[] buffer = new byte[1024];

到外部循环之前,因此只创建一次。