Java工具包异常:ZIP文件中的条目太多。

7
我正在尝试编写一个Java类来提取一个包含约74000个XML文件的大型zip文件。当我尝试使用Java zip库解压它时,会出现以下异常:java.util.zip.ZipException: ZIP文件中的条目太多。很遗憾,由于项目要求,我不能在收到文件之前将zip文件拆分,而且解压过程必须自动化(不能有手动步骤)。是否有办法利用java.util.zip或某些第三方Java zip库绕过这个限制?谢谢。
4个回答

7
使用 ZipInputStream 而不是 ZipFile 应该可以解决问题。

3

使用Apache IOUtils:

FileInputStream fin = new FileInputStream(zip);
ZipInputStream zin = new ZipInputStream(fin);
ZipEntry ze = null;

while ((ze = zin.getNextEntry()) != null) {
    FileOutputStream fout = new FileOutputStream(new File(
                    outputDirectory, ze.getName()));

    IOUtils.copy(zin, fout);

    IOUtils.closeQuietly(fout);
    zin.closeEntry();
}

IOUtils.closeQuietly(zin);

1

Zip标准支持文件中最多65536个条目。 除非Java库支持ZIP64扩展,否则如果您尝试读取或写入具有74000个条目的存档,它将无法正常工作。


-1

我重新设计了这个方法,使其更方便地处理目录结构并一次性压缩大量目标。 如果传递的是普通文件,则会将其添加到 zip 文件的根目录中;如果传递的是目录,则其底层结构将被保留。

def zip (String zipFile, String [] filesToZip){ 
    def result = new ZipOutputStream(new FileOutputStream(zipFile))
    result.withStream { zipOutStream ->
        filesToZip.each {fileToZip ->
            ftz = new File(fileToZip)
            if(ftz.isDirectory()){
                pathlength = new File(ftz.absolutePath).parentFile.absolutePath.size()
                ftz.eachFileRecurse {f ->               
                    if(!f.isDirectory()) writeZipEntry(f, zipOutStream, f.absolutePath[pathlength..-1]) 
                }
            }               
            else writeZipEntry(ftz, zipOutStream, '')
        }
    }
}

def writeZipEntry(File plainFile, ZipOutputStream zipOutStream, String path) {
    zipOutStream.putNextEntry(new ZipEntry(path+plainFile.name))
    new FileInputStream(plainFile).withStream { inStream ->
        def buffer = new byte[1024]
        def count
        while((count = inStream.read(buffer, 0, 1024)) != -1) 
            zipOutStream.write(buffer)                  
    }
    zipOutStream.closeEntry()
}

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