Dezarhivarea unui volum multiplu de fișiere zip folosind Java

Trebuie să dezarhivez un set de fișiere care sunt o arhivă zip. Acesta nu este un set de fișiere zip, acesta este un fișier mare zip care a fost împărțit în mai multe fișiere zip bazat pe o cerință de dimensiune.

De exemplu, dacă aveți un fișier zip de 2,5 MB și sistemul dvs. de e-mail acceptă numai fișiere de 1 MB, puteți să cereți lui Zip să creeze 3 fișiere de cel mult 1 MB.

Deci, creează a.zip.001, a.zip.002, a.zip.003 ... diferitele biblioteci le numesc diferit, dar, în esență, toate funcționează în același mod.

Cum dezarhivați acest lucru în Java? Nu arata ca compresia libs in std sustine acest lucru.

Mulțumiri.

0
Cum a fost rupt fișierul zip în părți?
adăugat autor Puce, sursa
Am încercat chilkat care pare să aibă o mulțime de caracteristici, dar nu acceptă arhive multi-fișier. Nici măcar în lista cu todo în acest moment.
adăugat autor awm, sursa
Probabil un duplicat de stackoverflow.com/questions/8116443/…
adăugat autor Emmanuel Bourg, sursa

1 răspunsuri

Încercați să concatenați toate fișierele într-un singur fișier și apoi extrageți singurul fișier. Ceva asemănător cu:

    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*/

Actualizare: a folosit un TreeSet pentru a sorta numele fișierelor, deoarece dir.list() nu garantează ordinea alfabetică.

0
adăugat
Dacă utilizați Java SE 7, vă recomandăm să utilizați ARM (încercați (...) {}) în loc să închideți fluxurile manual.
adăugat autor Puce, sursa
Deși nu exact același cod, am încercat acest lucru și sa rupt. Concatenarea pare să rupă zipul. Am "THINK" că fiecare fișier are un antet propriu, astfel încât sistemul să știe ce număr de parte este, care nu ar trebui să facă parte din flux.
adăugat autor awm, sursa
@awm Am încercat cu un zip comprimat folosind 7zip și a funcționat bine. Asigurați-vă că folderul pe care îl utilizați conține numai fișierele zip. A apărut o problemă cu ordinea fișierelor, dar am rezolvat-o în această actualizare.
adăugat autor tibtof, sursa