18

假设我们有如下代码:

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

假设您有一个包含以下内容的 .zip 文件:

  • zip1.zip
    • 你好ç
    • 世界.java
    • 文件夹1
      • foo.c
      • 酒吧.java
    • foob​​ar.c

zis.getNextEntry() 将如何迭代呢?

它会返回 hello.c、world.java、folder1、foobar.c 并完全忽略 folder1 中的文件吗?

或者它会返回 hello.c、world.java、folder1、foo.c、bar.java,然后是 foobar.c?

它甚至会返回 folder1,因为它在技术上是一个文件夹而不是一个文件?

谢谢!

4

4 回答 4

25

走着瞧:

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

输出:

新建文件夹/

新建文件夹/folder1/

新建文件夹/folder1/bar.java

新建文件夹/folder1/foo.c

新建文件夹/foobar.c

新建文件夹/hello.c

新文件夹/world.java

于 2012-08-02T19:19:07.027 回答
16

是的。它也会打印文件夹名称,因为它也是 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());
        }
    }
}
于 2012-08-02T19:13:21.553 回答
1

摘自:https ://blogs.oracle.com/CoreJavaTechTips/entry/creating_zip_and_jar_files

java.util.zip 库为 ZipOutputStream 添加的条目提供了某种程度的控制。

首先,将条目添加到 ZipOutputStream 的顺序是它们在 .zip 文件中的物理位置顺序

您可以操作 ZipFile 的 entries() 方法返回的条目枚举,以按字母顺序或大小顺序生成列表,但条目仍按写入输出流的顺序存储。

所以我相信你必须使用 entry() 方法来查看迭代的顺序。

 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());
    }
于 2012-08-02T19:13:30.967 回答
1

zip 文件内部目录是 zip 中所有文件和目录的“平面”列表。 getNextEntry将遍历列表并按顺序识别 zip 文件中的每个文件和目录。

zip 文件格式的一种变体没有中央目录,在这种情况下(如果它被处理的话)我怀疑你会遍历 zip 中的所有实际文件,跳过目录(但不跳过目录中的文件)。

于 2012-08-02T19:19:09.243 回答