Décompression d'un volume de fichiers zip en plusieurs parties en utilisant Java

J'ai besoin de décompresser un ensemble de fichiers qui sont une archive zip. Ce n'est pas un ensemble de fichiers zip, c'est un gros fichier zip qui a été divisé en plusieurs fichiers zip en fonction d'une exigence de taille.

Par exemple, si vous avez un fichier zip de 2,5 Mo et que votre système de messagerie ne supporte que des fichiers de 1 Mo, vous pouvez demander à Zip de créer 3 fichiers d'au plus 1 Mo.

Il crée donc a.zip.001, a.zip.002, a.zip.003 ... différentes bibliothèques les nomment différemment mais essentiellement elles fonctionnent toutes de la même manière.

Comment décompressez-vous cela en Java? Il ne semble pas que les bibliothèques de compression dans std supportent cela.

Merci.

0
Comment le fichier zip a-t-il été divisé en plusieurs parties?
ajouté l'auteur Puce, source
J'ai essayé chilkat qui semble avoir beaucoup de fonctionnalités mais il ne supporte pas les archives multi-fichiers. Pas même sur la liste des tâches à ce stade.
ajouté l'auteur awm, source
Probablement un doublon de stackoverflow.com/questions/8116443/…
ajouté l'auteur Emmanuel Bourg, source

1 Réponses

Essayez de concaténer tous les fichiers dans un seul fichier, puis extrayez le fichier unique. Quelque chose comme:

    File dir = new File("D:/arc");
    FileOutputStream fos = new FileOutputStream(new File(
            "d:/arc/archieve-full.zip"));
    FileInputStream fis = null;
        Set files = new TreeSet();
        for (String fname : dir.list()) {
            files.add(fname);
        }
        for (String fname : files) {
        try {
            fis = new FileInputStream(new File(dir.getAbsolutePath(), fname));
            byte[] b = new byte[fis.available()];
            fis.read(b);
            fos.write(b);
        } finally {
            if (fis != null) {
                fis.close();
            }
            fos.flush();
        }
    }
    fos.close();
    ZipFile zipFile = new ZipFile("d:/arc/archieve-full.zip");
    /*extract files from zip*/

Mise à jour: utilisez un TreeSet pour trier les noms de fichiers, car dir.list() ne garantit pas l'ordre alphabétique.

0
ajouté
Si vous utilisez Java SE 7, je recommande d'utiliser ARM (essayez (...) {}) au lieu de fermer les flux manuellement.
ajouté l'auteur Puce, source
Bien que ce ne soit pas exactement le même code, j'ai essayé et ça a cassé. Concaténation semble briser le zip. Je "pense" que chaque fichier a son propre en-tête afin que le système sache quel numéro de pièce il ne doit pas faire partie du flux.
ajouté l'auteur awm, source
@awm J'ai essayé avec un zip compressé en utilisant 7zip et cela a bien fonctionné. Assurez-vous que le dossier que vous utilisez contient uniquement les fichiers zip. Il y avait un problème avec l'ordre des fichiers, mais je l'ai corrigé dans cette mise à jour.
ajouté l'auteur tibtof, source