我正在编写一个Java程序,它可以根据限定名称(例如:java.lang.String),从JDK的src.zip文件中提取并返回相应的条目以供进一步处理。
到目前为止,我的程序对于任何指向特定.java源文件的限定名称都可以正常工作;但是,当限定名称指向整个包(例如:java.util.*)时,我遇到了麻烦。在这种情况下,我希望我的程序返回给定包中所有条目的列表。
问题在于似乎没有一种(高效的)方式可以使用java.util.zip.*包中提供的实用程序来实现这样的操作!我已经尝试过ZipFile和ZipInputStream,但它们都无法识别src.zip文件中的目录!它们只返回单个.java源文件的条目!
在代码语言中,两者如下:
一个解决方法是使用我上面列出的两种迭代方式之一,并对所需条目进行全面搜索。
但很明显这并不高效!有没有办法从
到目前为止,我的程序对于任何指向特定.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());
并且:
Enumeration<? extends ZipEntry> zip = new ZipFile("src.zip").entries();
while (zip.hasMoreElements()) {
ZipEntry entry = zip.nextElement();
System.out.println(entry.isDirectory());
}
始终返回 false,没有任何目录!
即使以下代码也是无用的,只会返回 null
(表示未找到):
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版本(例如JDK-7 update-80)的其他src.zip
文件时,结果会有所不同。感谢marabu在评论中指出的unzip -l
实用程序。
注意
虽然解决了检索目录条目的问题,但仍未解决从ZIP文件的给定目录路径中有效地检索条目列表的问题。但是该案件仍已关闭,因为根据Timothy Truckle的答案,由于ZIP格式的限制,除了对条目进行穷举搜索外,无法以其他方式完成此操作。
src.zip
文件有关?因为我见过其他ZIP文件中确实有目录条目。 - Seyed Mohammad