ZipInputStream.getNextEntry()如何工作?

时间:2012-08-02 19:03:44

标签: java zip

假设我们的代码如下:

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并完全忽略folder1中的文件吗?

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

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

谢谢!

4 个答案:

答案 0 :(得分:23)

嗯......让我们看看:

        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

     

New Folder / world.java

答案 1 :(得分:13)

是。它也会打印文件夹名称,因为它也是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 :(得分:1)

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

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

首先,您向ZipOutputStream添加条目的顺序是它们实际位于.zip文件中的顺序

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

所以我认为你必须使用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());
    }

答案 3 :(得分:1)

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

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