Frage

Ich versuche, eine Java-Klasse zu schreiben, eine große Zip-Datei zu extrahieren, enthält ~ 74000 XML-Dateien. Ich erhalte die folgende Ausnahme bei dem Versuch, sie entpacken Sie die Java-Zip-Bibliothek verwendet:

java.util.zip.ZipException : zu viele Einträge in ZIP-Datei

Leider ist aufgrund der Anforderungen des Projekts kann ich die Zip nicht kaputt gehen, bevor es mir bekommt, und das Aufgehen Prozess muss automatisiert werden (keine manuellen Schritte). Gibt es eine Möglichkeit, um diese Einschränkung zu erhalten unter Verwendung java.util.zip oder mit einer 3rd-Party-Java Zip-Bibliothek?

Danke.

War es hilfreich?

Lösung

Mit ZipInputStream statt ZipFile sollte es wahrscheinlich tun.

Andere Tipps

Apache IOUtils verwenden:

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

Der Zip-Standard unterstützt einen max von 65536 Einträgen in einer Datei. Es sei denn, die Java-Bibliothek ZIP64 Erweiterungen unterstützt, wird es nicht richtig, wenn Sie versuchen, ein Archiv mit 74.000 Einträgen zu lesen oder schreiben.

überarbeitete ich die Methode mit Verzeichnisstrukturen bequemer zu beschäftigen und eine ganze Reihe von Zielen auf einmal sehen lassen. Plain-Dateien werden in der Wurzel der Zip-Datei hinzugefügt werden, wenn Sie ein Verzeichnis übergeben, wird die zugrunde liegende Struktur beibehalten werden.

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()
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top