2012-08-02 5 views
11

Dire che abbiamo un codice simile:Come funziona ZipInputStream.getNextEntry()?

File file = new File("zip1.zip"); 
ZipInputStream zis = new ZipInputStream(new FileInputStream(file)); 

Si ipotizzi di avere un file .zip che contiene il seguente:

  • zip1.zip
    • ciao.c
    • world.java
    • cartella1
      • foo.c
      • bar.java
    • foobar.c

Come sarebbe zis.getNextEntry() iterare questo?

Restituisce ciao.c, world.java, folder1, foobar.c e ignora completamente i file nella cartella1?

Oppure restituire ciao.c, world.java, folder1, foo.c, bar.java e quindi foobar.c?

Potrebbe anche restituire folder1 poiché tecnicamente è una cartella e non un file?

Grazie!

+0

ZipEntry può rappresentare anche una directory. Vedere il metodo [isDirectory()] (http://docs.oracle.com/javase/6/docs/api/java/util/zip/ZipEntry.html#isDirectory()). – Bobulous

risposta

8

Sì. Stamperà anche il nome della cartella, poiché è anche una voce all'interno dello zip. Inoltre, verrà stampato nello stesso ordine in cui viene visualizzato all'interno dello zip. È possibile utilizzare sotto test per verificare l'output.

public class TestZipOrder { 
    @Test 
    public void testZipOrder() throws Exception { 
     File file = new File("/Project/test.zip"); 
     ZipInputStream zis = new ZipInputStream(new FileInputStream(file)); 
     ZipEntry entry = null; 
     while ((entry = zis.getNextEntry()) != null) { 
     System.out.println(entry.getName()); 
     } 
    } 
} 
1

Estratto da: https://blogs.oracle.com/CoreJavaTechTips/entry/creating_zip_and_jar_files

librerie java.util.zip offrono un certo livello di controllo per le voci aggiunte del ZipOutputStream.

In primo luogo, l'ordine in cui si aggiungono voci a ZipOutputStream è l'ordine in cui si trovano fisicamente nel file .zip.

È possibile manipolare l'enumerazione di voci restituite dal metodo entries() di ZipFile per produrre un elenco in ordine alfabetico o di dimensioni, ma le voci sono ancora memorizzate nell'ordine in cui sono state scritte nel flusso di output.

Quindi, credo che sia necessario utilizzare il metodo entries() per visualizzare l'ordine in cui verrà iterato.

ZipFile zf = new ZipFile("your file path with file name"); 
    for (Enumeration<? extends ZipEntry> e = zf.entries(); 
    e.hasMoreElements();) { 
     System.out.println(e.nextElement().getName()); 
    } 
20

Bene ...Vediamo:

 ZipInputStream zis = new ZipInputStream(new FileInputStream("C:\\New Folder.zip")); 
     try 
     { 
      ZipEntry temp = null; 
      while ((temp = zis.getNextEntry()) != null) 
      { 
      System.out.println(temp.getName()); 
      } 
     } 

uscita:

Nuova cartella/

Nuova cartella/cartella1/

Nuova cartella/cartella1/bar.java

Nuova cartella/cartella1 /foo.c

Nuova cartella/foo bar.c

Nuova cartella/ciao.c

Nuova cartella/world.java

+0

Grazie, se avessi 15 reputazione, lo manterrei! – joshualan

+0

@joshualan - Oppure avresti potuto semplicemente provare a scrivere un codice e provarlo tu stesso :) – Sujay

+0

Ho provato e non sapevo che dovessi fare C: \\ per raggiungere le mie directory. Errore newbie: S – joshualan

1

directory interna Il file zip è una lista "flat" di tutti i file e le directory nella zip. getNextEntry itererà l'elenco e identificherà in sequenza ogni file e directory nel file zip.

C'è una variante del formato di file zip che non ha una directory centrale, nel qual caso (se è gestita affatto) ho il sospetto che avresti iterato attraverso tutti i file effettivi nello zip, saltando le directory (ma non saltando i file nelle directory).