在ZIP文件中获取目录条目

时间:2017-02-12 08:26:25

标签: java zipfile

我正在编写一个给出限定名称(如:java.lang.String)的Java程序,从JDK中的src.zip文件中获取并返回相应的条目,以便进一步处理。 / p>

到目前为止,我的程序适用于任何引用特定.java源文件的限定名称;但是当限定名称引用整个包时(例如:java.util.*),我遇到了麻烦。在这种情况下,我希望我的程序返回给定包中所有条目的列表。

问题是似乎没有办法(有效地)使用java.util.zip.*包中提供的实用程序来做这样的事情!我已经尝试了ZipFileZipInputStream,但没有人识别src.zip文件中的目录!他们只返回单个.java源文件的条目!

在代码语言中,两者都是:

ZipEntry entry;
ZipInputStream zip = new ZipInputStream(new FileInputStream("src.zip"));
while((entry = zip.getNextEntry()) != null) 
    System.out.println(entry.isDirectory());

Enumeration<? extends ZipEntry> zip = new ZipFile("src.zip").entries();
while (zip.hasMoreElements()) {
    ZipEntry entry = zip.nextElement();
    System.out.println(entry.isDirectory());
}

总是返回false;根本没有目录!

即使以下代码也没用,只返回null(这意味着Not Found):

ZipFile zipfile = new ZipFile("src.zip");
zipfile.getEntry("java/util/");

解决方法是使用上面列出的两次迭代中的任何一种,并对所需的条目进行详尽的搜索:

if (entry.getName().startsWith("java/util/"))
    System.out.println(entry);

但显然这效率不高!是否无法检索src.zip文件中的目录条目或有效列出给定目录路径的条目?请注意,我想直接处理ZIP文件而不提取(出于显而易见的原因)。

更新

Timothy Truckle 的答案中的讨论可以看出,上述结果是使用最新Oracle JDK中的src.zip文件实现的。写这篇文章的时间(即JDK-8 update-111)。使用来自不同JDK版本的另一个src.zip文件(例如JDK-7 update-80)时,结果会有所不同。信用证转到 marabu ,用于在评论中指出unzip -l实用程序。

注意

虽然解决了检索目录条目的问题,但是有效地检索ZIP文件的给定目录路径中包含的条目列表的问题仍未解决。然而案件仍然关闭,因为根据 Timothy Truckle 的答案,由于ZIP格式的限制,这不能以任何其他方式完成,而不是在条目中进行详尽的搜索。

1 个答案:

答案 0 :(得分:2)

  

@RC。所以你说它与这个特定的src.zip文件有关吗?因为我看过其他ZIP文件确实有目录条目。 - 赛义德·穆罕默德

不,是的。 ZIP file format只知道文件而不知道目录。

您可能在其他zip文件中看到的是,它们为每个(子)文件夹包含一个名为.的零长度文件。但这不是必需的,也不是默认的。

但即使存在这些特殊条目,您也无法直接将它们作为ZIP中的文件夹处理(即使连续列出同一子文件夹中的所有文件也是偶然的,既不需要也不暗示)。