繁体   English   中英

在 java 中使用广度优先搜索方法搜索 ZipEntry

[英]Search ZipEntry using breadth-first search approach in java

我在寻找一种以广度优先搜索方式在 java 中遍历 ZipFile 的方法时遇到问题。

我发现使用 ZipInputStream 任一枚举方法获取所有条目都会以深度优先搜索方式对它们进行排序。 我还检查了使用调试。

代码 1:

ZipInputStream zf = new ZipInputStream(inputStream);
ZipEntry[] entries;
ZipEntry zipEntry;

while ((zipEntry = zf.getNextEntry()) != null)
{
  entries.add(zipEntry);
}

代码 2:

ZipEntry[] entries;
Enumeration<ZipEntry> enumeration = zipFile.entries();

while (enumeration.hasMoreElements())
{
  entries.add(en.nextElement());
}

示例 zip 文件:

foo.zip
| -- folder1
|    | -- file11
|    | -- file12
| -- folder2
|    | -- file21
|    | -- file22
| -- lorem.txt

我想按以下顺序获取条目:

1. folder1/
2. folder2/
3. lorem.txt
4. folder1/file11
5. folder1/file12
6. folder2/file21
7. folder2/file22

等等...

但相反,我得到的是:

1. folder1/
2. folder1/file11
3. folder1/file12
4. folder2/
5. folder2/file21
6. folder2/file22
7. lorem.txt

有谁知道我怎样才能实现我的目标?

标准库不提供此功能,您必须自己完成。

将条目放入一个新列表中,然后按深度排序,然后按名称排序:

List<ZipEntry> entries = new ArrayList<>();
Enumeration<? extends ZipEntry> entriesEnum = zipFile.entries();
while(entriesEnum.hasMoreElements()) entries.add(entriesEnum.nextElement());
entries.sort(Comparator.<ZipEntry, Integer>comparing(e -> e.getName().split("/").length).thenComparing(ZipEntry::getName));

您现在可以遍历该列表以按广度优先顺序遍历条目。

这有点像 hack,因为我们并没有真正遍历一棵树,但它产生了相同的结果。

其实ZipEntry,所以,所以你不能用一个真正的顺序,作为一个单独的顺序,用这个ZipEntry来获取到你的流的问题意义重大

在我看来,ZipEntry 只是一个位置,所以你不能只尝试使用 ZipEntry 的顺序来获得真正的流,所以你的问题并不重要

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM