Как работает ZipInputStream.getNextEntry()?
Скажем, у нас есть код вроде:
File file = new File("zip1.zip");
ZipInputStream zis = new ZipInputStream(new FileInputStream(file));
Предположим, что у вас есть .zip файл, который содержит следующее:
- zip1.zip
- hello.c
- world.java
- folder1
- 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 файле, пропуская каталоги (но не пропуская файлы в каталоги).