Question

J'essaie d'écrire une classe Java pour extraire un fichier zip volumineux contenant environ 74 000 fichiers XML. Je reçois l’exception suivante lorsque je tente de le décompresser à l’aide de la bibliothèque java zip:

java.util.zip.ZipException : trop d'entrées dans le fichier ZIP

Malheureusement, en raison des exigences du projet, je ne peux pas obtenir le code zip avant de me le communiquer, et le processus de décompression doit être automatisé (aucune étape manuelle). Existe-t-il un moyen de contourner cette limitation en utilisant java.util.zip ou avec une bibliothèque zip Java tierce partie?

Merci.

Était-ce utile?

La solution

Utiliser ZipInputStream au lieu de ZipFile devrait probablement le faire.

Autres conseils

Utilisation d’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);

La norme Zip prend en charge un maximum de 65 536 entrées dans un fichier. Si la bibliothèque Java ne prend pas en charge les extensions ZIP64, cela ne fonctionnera pas correctement si vous essayez de lire ou d’écrire une archive de 74 000 entrées.

J'ai retravaillé la méthode pour traiter les structures de répertoires de manière plus pratique et compresser tout un tas de cibles à la fois. Les fichiers simples seront ajoutés à la racine du fichier zip. Si vous passez un répertoire, la structure sous-jacente sera préservée.

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()
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top