我正在编写一个 Java 程序,它给定一个限定名称(例如:java.lang.String
),从 src.zip
中获取并返回相应的条目> JDK 中的文件以供进一步处理。
到目前为止,我的程序适用于任何引用特定 .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
(这意味着 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 版本(例如 JDK-7 update-80)的另一个 src.zip
文件时,结果会有所不同。感谢 marabu 在评论中指出 unzip -l
实用程序。
注意事项
虽然检索目录条目的问题得到解决,但高效检索包含在 ZIP 文件的给定目录路径中的条目列表的问题没有得到解决。然而,案件仍未结案,因为根据 Timothy Truckle 的回答,由于 ZIP 格式的限制,除了在条目中进行详尽搜索之外,无法通过任何其他方式完成此操作。
最佳答案
@RC. So your saying that it's related to this specific src.zip file? Because I've seen other ZIP files which do have entries for directories. – Seyed Mohammad
否和是。 ZIP file format只知道文件但不知道目录。
您可能在其他 zip 文件中看到的是,它们为每个(子)文件夹包含一个名为 .
的零长度文件。但这不是必需的,也不是默认的。
但即使存在这些特殊条目,您也不能直接将它们作为 ZIP 中的文件夹处理(即使同一子文件夹中的所有文件连续列出也是偶然的,既不是必需的也不是暗示的)。
关于java - 获取 ZIP 文件中的目录条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42185591/