2012-08-02 15 views
11

że mamy kod jak:Jak działa ZipInputStream.getNextEntry()?

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

Załóżmy, że masz plik ZIP, który zawiera następujące elementy:

  • zip1.zip
    • hello.c
    • world.java
    • folder1
      • foo.c
      • bar.java
    • foobar.c

Jak zis.getNextEntry() iterację że?

Czy zwróci plik hello.c, world.java, folder1, foobar.c i całkowicie zignoruje pliki w folderze1?

A może zwróci plik hello.c, world.java, folder1, foo.c, bar.java, a następnie foobar.c?

Czy zwróci folder1, ponieważ jest to z technicznego punktu widzenia folder, a nie plik?

Dzięki!

+0

ZipEntry może również reprezentować katalog. Zobacz metodę [isDirectory()] (http://docs.oracle.com/javase/6/docs/api/java/util/zip/ZipEntry.html#isDirectory()). – Bobulous

Odpowiedz

8

Tak. Będzie również drukować nazwę folderu, ponieważ jest to również wpis w zip. Drukuje również w tej samej kolejności, w jakiej jest wyświetlany wewnątrz suwaka. Możesz użyć poniższego testu, aby zweryfikować wyniki.

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

Fragment: https://blogs.oracle.com/CoreJavaTechTips/entry/creating_zip_and_jar_files

biblioteki java.util.zip oferują pewien poziom kontroli dla dodawanych wpisów z ZipOutputStream.

Po pierwsze, kolejność dodawania wpisów do ZipOutputStream jest to kolejność, w jakiej fizycznie znajdują się w pliku .zip.

Możesz manipulować wyliczaniem pozycji zwróconych przez metodę entries() pliku ZipFile w celu utworzenia listy w kolejności alfabetycznej lub wielkości, ale wpisy są nadal przechowywane w kolejności, w jakiej zostały zapisane w strumieniu wyjściowym.

Więc uważam, że musisz użyć metody entries(), aby zobaczyć kolejność, w której będzie iterowane przez.

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

Cóż ...Pozwala zobaczyć:

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

wyjściowy:

Nowy folder/

Nowy folder/folder1/

Nowy folder/folder1/bar.java

Nowy folder/Folder1 /foo.c

Nowy folder/foo bar.c

world.java

+0

Dzięki, gdybym miał 15 punktów reputacji, przegrałbym to! – joshualan

+0

@joshualan - Albo mógłbyś po prostu spróbować napisać kawałek kodu i przetestować go sam :) – Sujay

+0

Próbowałem i nie wiedziałem, że musisz zrobić C: \\, aby dotrzeć do moich katalogów. Błąd nowicjusza: S – joshualan

1

katalog New Folder/hello.c

Nowy folder/plik zip wewnętrzny jest "płaska" lista wszystkich plików i katalogów w zip. getNextEntry będzie iterować listę i sekwencyjnie identyfikować każdy plik i katalog w pliku zip.

Istnieje wariant formatu pliku zip, który nie ma katalogu centralnego, w którym to przypadku (jeśli jest w ogóle obsługiwany) podejrzewam, że dokonałbyś iteracji wszystkich rzeczywistych plików w pliku zip, pomijając katalogi (ale nie pomijając plików w katalogach).