在ZIP文件中获取目录条目

Sey*_*mad 5 java zipfile

我正在编写一个Java程序,它给出了一个限定名(如java.lang.String:),从src.zipJDK中的文件中获取并返回相应的条目以供进一步处理.

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

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

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

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

和:

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

总是回归虚假; 根本没有目录!

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

ZipFile zipfile = new ZipFile("src.zip");
zipfile.getEntry("java/util/");
Run Code Online (Sandbox Code Playgroud)

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

if (entry.getName().startsWith("java/util/"))
    System.out.println(entry);
Run Code Online (Sandbox Code Playgroud)

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


更新

Timothy Truckle的回答中可以看出,上面的结果是src.zip在撰写本文时使用最新的Oracle JDK文件(即JDK-8 update-111)实现的.使用src.zip来自不同JDK版本的另一个文件(例如JDK-7 update-80)时,结果会有所不同.在评论中指出实用程序的功劳归功于marabuunzip -l.

注意

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

Tim*_*kle 4

\n

@RC。那么你的意思是它与这个特定的 src.zip 文件有关?因为我见过其他 ZIP 文件,它们确实有目录条目。\xe2\x80\x93 赛义德·穆罕默德

\n
\n\n

否和是。ZIP 文件格式只识别文件而不识别目录。

\n\n

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

\n\n

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

\n