From 6c3a924db7a53877662a35ac16c20a75bb773098 Mon Sep 17 00:00:00 2001 From: Glavo Date: Sat, 2 Aug 2025 19:17:54 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=20ArchiveFileTree?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hmcl/util/tree/ArchiveFileTree.java | 32 +++++++++++++++---- .../jackhuang/hmcl/util/tree/ZipFileTree.java | 18 +++++++---- 2 files changed, 38 insertions(+), 12 deletions(-) diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/tree/ArchiveFileTree.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/tree/ArchiveFileTree.java index 33a674c3f..8a0369e8a 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/tree/ArchiveFileTree.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/tree/ArchiveFileTree.java @@ -19,6 +19,9 @@ package org.jackhuang.hmcl.util.tree; import kala.compress.archivers.ArchiveEntry; import kala.compress.archivers.zip.ZipArchiveReader; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.UnmodifiableView; import java.io.Closeable; import java.io.IOException; @@ -48,7 +51,7 @@ public abstract class ArchiveFileTree implements Clos } protected final F file; - protected final Dir root = new Dir<>(); + protected final Dir root = new Dir<>(""); public ArchiveFileTree(F file) { this.file = file; @@ -62,7 +65,7 @@ public abstract class ArchiveFileTree implements Clos return root; } - public void addEntry(E entry) throws IOException { + protected void addEntry(E entry) throws IOException { String[] path = entry.getName().split("/"); Dir dir = root; @@ -78,7 +81,7 @@ public abstract class ArchiveFileTree implements Clos throw new IOException("A file and a directory have the same name: " + entry.getName()); } - dir = dir.subDirs.computeIfAbsent(item, name -> new Dir<>()); + dir = dir.subDirs.computeIfAbsent(item, Dir::new); } if (entry.isDirectory()) { @@ -113,16 +116,33 @@ public abstract class ArchiveFileTree implements Clos public abstract void close() throws IOException; public static final class Dir { - E entry; + private final String name; + private E entry; final Map> subDirs = new HashMap<>(); final Map files = new HashMap<>(); - public Map> getSubDirs() { + public Dir(String name) { + this.name = name; + } + + public boolean isRoot() { + return name.isEmpty(); + } + + public @NotNull String getName() { + return name; + } + + public @Nullable E getEntry() { + return entry; + } + + public @NotNull @UnmodifiableView Map> getSubDirs() { return subDirs; } - public Map getFiles() { + public @NotNull @UnmodifiableView Map getFiles() { return files; } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/tree/ZipFileTree.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/tree/ZipFileTree.java index ba8188362..602200279 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/tree/ZipFileTree.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/tree/ZipFileTree.java @@ -19,6 +19,7 @@ package org.jackhuang.hmcl.util.tree; import kala.compress.archivers.zip.ZipArchiveEntry; import kala.compress.archivers.zip.ZipArchiveReader; +import org.jackhuang.hmcl.util.io.IOUtils; import java.io.IOException; import java.io.InputStream; @@ -27,25 +28,30 @@ import java.io.InputStream; * @author Glavo */ public final class ZipFileTree extends ArchiveFileTree { + private final boolean closeReader; + public ZipFileTree(ZipArchiveReader file) throws IOException { + this(file, true); + } + + public ZipFileTree(ZipArchiveReader file, boolean closeReader) throws IOException { super(file); + this.closeReader = closeReader; try { for (ZipArchiveEntry zipArchiveEntry : file.getEntries()) { addEntry(zipArchiveEntry); } } catch (Throwable e) { - try { - file.close(); - } catch (Throwable e2) { - e.addSuppressed(e2); - } + if (closeReader) + IOUtils.closeQuietly(file, e); throw e; } } @Override public void close() throws IOException { - file.close(); + if (closeReader) + file.close(); } @Override