2012-08-02 21 views
11

Digamos que tenemos un código como:¿Cómo funciona ZipInputStream.getNextEntry()?

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

Supongamos que usted tiene un archivo .zip que contiene lo siguiente:

  • zip1.zip
    • hola.c
    • world.java
    • carpeta1
      • foo.c
      • bar.java
    • foobar.c

¿Cómo zis.getNextEntry() iterar a través de eso?

¿Volvería hello.c, world.java, folder1, foobar.c e ignorará por completo los archivos en la carpeta1?

¿O devolvería hello.c, world.java, folder1, foo.c, bar.java, y luego foobar.c?

¿Volvería a devolver la carpeta1 ya que técnicamente es una carpeta y no un archivo?

Gracias!

+0

ZipEntry puede representar un directorio también. Consulte el método [isDirectory()] (http://docs.oracle.com/javase/6/docs/api/java/util/zip/ZipEntry.html#isDirectory()). – Bobulous

Respuesta

8

Sí. También imprimirá el nombre de la carpeta, ya que también es una entrada dentro del zip. También se imprimirá en el mismo orden en que se muestra dentro del zip. Puede usar la prueba siguiente para verificar su resultado.

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

Extracto de: https://blogs.oracle.com/CoreJavaTechTips/entry/creating_zip_and_jar_files

bibliotecas java.util.zip ofrecen cierto nivel de control de las entradas secundarias de la ZipOutputStream.

En primer lugar, el orden en que agrega entradas al ZipOutputStream es el orden en que se encuentran físicamente en el archivo .zip.

Puede manipular la enumeración de las entradas devueltas por el método de entradas() de ZipFile para producir una lista en orden alfabético o por tamaño, pero las entradas todavía se almacenan en el orden en que se escribieron en la secuencia de salida.

Así que creo que tiene que usar el método de entradas() para ver el orden en que se repetirá.

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

Bien ...Vamos a ver:

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

Salida:

nueva carpeta/

nueva carpeta/carpeta1/

nueva carpeta/carpeta1/bar.java

nueva carpeta/carpeta1 /foo.c

Nueva carpeta/foo bar.c

world.java

+0

¡Gracias, si tuviera 15 de reputación, votaría esto! – joshualan

+0

@joshualan - O simplemente podría haber intentado escribir un código y probarlo usted mismo :) – Sujay

+0

Lo intenté y no sabía que tenía que hacer C: \\ para llegar a mis directorios. Error de principiante: S – joshualan

1

directorio interno nueva carpeta/hola.c

nueva carpeta/archivo zip es una lista "plana" de todos los archivos y directorios en el zip. getNextEntry iterará a través de la lista e identificará secuencialmente cada archivo y directorio en el archivo zip.

Hay una variante del formato de archivo zip que no tiene un directorio central, en cuyo caso (si se maneja) Sospecho que iterarás a través de todos los archivos reales en el zip, omitiendo directorios (pero no omitiendo archivos en directorios).