假设我们的代码如下:
File file = new File("zip1.zip");
ZipInputStream zis = new ZipInputStream(new FileInputStream(file));
假设您有一个包含以下内容的.zip文件:
zis.getNextEntry()将如何迭代?
它会返回hello.c,world.java,folder1,foobar.c并完全忽略folder1中的文件吗?
或者它会返回hello.c,world.java,folder1,foo.c,bar.java,然后是foobar.c吗?
它甚至会返回folder1,因为它在技术上是一个文件夹而不是文件吗?
谢谢!
答案 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中的所有实际文件,跳过目录(但不跳过文件)目录)。