Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.util.zip.ZipException:zip文件中的条目太多_Java_Zip_Large Files_Unzip - Fatal编程技术网

java.util.zip.ZipException:zip文件中的条目太多

java.util.zip.ZipException:zip文件中的条目太多,java,zip,large-files,unzip,Java,Zip,Large Files,Unzip,我正试图编写一个Java类来提取一个包含约74000个XML文件的大型zip文件。尝试使用java zip库解压时,出现以下异常: java.util.zip.ZipException:zip文件中的条目太多 不幸的是,由于项目的要求,我无法在拉链到达我面前之前将其分解,解压过程必须是自动化的(没有手动步骤)。有没有办法利用java.util.zip或一些第三方java zip库来绕过这个限制 谢谢。使用ZipInputStream而不是ZipFile应该可以做到这一点。Zip标准支持文件中最多

我正试图编写一个Java类来提取一个包含约74000个XML文件的大型zip文件。尝试使用java zip库解压时,出现以下异常:

java.util.zip.ZipException:zip文件中的条目太多

不幸的是,由于项目的要求,我无法在拉链到达我面前之前将其分解,解压过程必须是自动化的(没有手动步骤)。有没有办法利用java.util.zip或一些第三方java zip库来绕过这个限制


谢谢。

使用
ZipInputStream
而不是
ZipFile
应该可以做到这一点。

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

使用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);

我修改了该方法,以更方便地处理目录结构,并一次压缩一大堆目标。 普通文件将被添加到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()
}