Как работает ZipInputStream.getNextEntry()?

Скажем, у нас есть код вроде:

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

Предположим, что у вас есть .zip файл, который содержит следующее:

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

Как zis.getNextEntry() будет проходить через это?

Будет ли он возвращать hello.c, world.java, folder1, foobar.c и полностью игнорировать файлы в папке1?

Или он вернет hello.c, world.java, folder1, foo.c, bar.java, а затем foobar.c?

Будет ли даже возвращать папку1, поскольку она технически является папкой, а не файлом?

Спасибо!

Ответ 1

Да. Он также напечатает имя папки, так как это также запись в zip. Он также будет печататься в том же порядке, что и внутри zip. Вы можете использовать тест ниже, чтобы проверить свой результат.

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());
        }
    }
}

Ответ 2

Ну... Давайте посмотрим:

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

Вывод:

Новая папка /

Новая папка/папка1/

Новая папка/папка1/bar.java

Новая папка/папка1/foo.c

Новая папка /foobar.c

Новая папка /hello.c

Новая папка /world.java

Ответ 3

Выдержка из: https://blogs.oracle.com/CoreJavaTechTips/entry/creating_zip_and_jar_files

Библиотеки

java.util.zip предлагают некоторый уровень контроля для добавленных записей ZipOutputStream.

Во-первых, порядок добавления записей в ZipOutputStream - это порядок, в котором они физически находятся в файле .zip.

Вы можете манипулировать перечислением записей, возвращаемых методом entries() ZipFile, для создания списка в алфавитном порядке или порядке сортировки, но записи сохраняются в том порядке, в котором они были записаны в выходной поток.

Итак, я считаю, что вам нужно использовать метод entries(), чтобы увидеть порядок, в котором он будет выполняться.

 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());
    }

Ответ 4

Внутренний каталог zip файла представляет собой "плоский" список всех файлов и каталогов в zip файле. getNextEntry будет перебирать список и последовательно идентифицировать каждый файл и каталог в zip файле.

Существует вариант формата zip файла, который не имеет центрального каталога, и в этом случае (если он вообще обрабатывается), я подозреваю, что вы перебирали все фактические файлы в zip файле, пропуская каталоги (но не пропуская файлы в каталоги).