java.util.zip.ZipException: слишком много записей в ZIP-файле - PullRequest
7 голосов
/ 27 января 2009

Я пытаюсь написать класс Java для извлечения большого zip-файла, содержащего ~ 74000 XML-файлов. Я получаю следующее исключение при попытке распаковать его, используя библиотеку java zip:

java.util.zip.ZipException : слишком много записей в ZIP-файле

К сожалению, из-за требований проекта я не могу разбить почтовый индекс до того, как он попадет ко мне, и процесс распаковки должен быть автоматизирован (без ручных шагов). Есть ли способ обойти это ограничение, используя java.util.zip или какую-нибудь стороннюю библиотеку zip Java?

Спасибо.

Ответы [ 4 ]

7 голосов
/ 27 января 2009

Использование ZipInputStream вместо ZipFile, вероятно, должно сделать это.

3 голосов
/ 29 июня 2009

Использование 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 голос
/ 10 февраля 2009

Стандарт Zip поддерживает до 65536 записей в файле. Если библиотека Java не поддерживает расширения ZIP64, она не будет работать должным образом, если вы пытаетесь читать или писать архив с 74 000 записей.

0 голосов
/ 03 августа 2009

Я переработал метод для более удобной работы со структурами каталогов и одновременной архивации целой группы целей. Простые файлы будут добавлены в корень 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()
}
...