java - 获取 ZIP 文件中的目录条目

标签 java zip

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

到目前为止,我的程序适用于任何引用特定 .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 版本(例如 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/

相关文章:

java - Spring MVC Hibernate 没有具有可用于当前线程的实际事务的 EntityManager - 无法可靠地处理 'persist' 调用

Java 枚举 : Two enum types, 每个都包含彼此的引用?

zip - 从 Inno Setup 中创建 ZIP 文件

java(安卓): try compressed I/O and failed

java - 对对象的对象进行排序

java - 警报对话框的处理结果如何? (安卓)

Java 泛型与两种泛型父类(super class)型的混淆

hadoop - 如何从Apache Spark中的压缩(.zip)本地文件制作数据集/数据框

java - 用Java压缩加密文件

android - 如何解压缩大型 zip 文件并在更短的时间内写入 SDCARD