簡體   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