From 606ceab12076f003e6fc98094bffc6ac9a1c66db Mon Sep 17 00:00:00 2001 From: Glavo Date: Fri, 18 Oct 2024 02:15:21 +0800 Subject: [PATCH] update --- .../jackhuang/hmcl/ui/nbt/NBTFileType.java | 23 +++++++++++++++---- .../hmcl/util/logging/CallerFinder.java | 5 ++-- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/nbt/NBTFileType.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/nbt/NBTFileType.java index a07ee37cbe..02dbbb844a 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/nbt/NBTFileType.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/nbt/NBTFileType.java @@ -5,10 +5,11 @@ import com.github.steveice10.opennbt.tag.builtin.IntTag; import com.github.steveice10.opennbt.tag.builtin.ListTag; import com.github.steveice10.opennbt.tag.builtin.Tag; -import org.apache.commons.io.input.BoundedInputStream; +import org.apache.commons.compress.utils.BoundedInputStream; import org.jackhuang.hmcl.util.io.FileUtils; import java.io.*; +import java.util.Arrays; import java.util.zip.GZIPInputStream; import java.util.zip.Inflater; import java.util.zip.InflaterInputStream; @@ -17,8 +18,22 @@ public enum NBTFileType { COMPRESSED("dat", "dat_old") { @Override public Tag read(File file) throws IOException { - try (InputStream in = new GZIPInputStream(new FileInputStream(file))) { - Tag tag = NBTIO.readTag(in); + try (BufferedInputStream fileInputStream = new BufferedInputStream(new FileInputStream(file))) { + fileInputStream.mark(3); + byte[] header = new byte[3]; + if (fileInputStream.read(header) < 3) { + throw new IOException("File is too small"); + } + fileInputStream.reset(); + + InputStream input; + if (Arrays.equals(header, new byte[]{0x1f, (byte) 0x8b, 0x08})) { + input = new GZIPInputStream(fileInputStream); + } else { + input = fileInputStream; + } + + Tag tag = NBTIO.readTag(input); if (!(tag instanceof CompoundTag)) throw new IOException("Unexpected tag: " + tag); return tag; @@ -62,7 +77,7 @@ public Tag read(File file) throws IOException { InputStream input = new ByteArrayInputStream(buffer); input.skip(5); - input = BoundedInputStream.builder().setInputStream(input).setMaxCount(chunkLength - 1).get(); + input = new BoundedInputStream(input, chunkLength - 1); switch (buffer[4]) { case 0x01: diff --git a/HMCL/src/main/java11/org/jackhuang/hmcl/util/logging/CallerFinder.java b/HMCL/src/main/java11/org/jackhuang/hmcl/util/logging/CallerFinder.java index 0f4fde774d..8c934cdaab 100644 --- a/HMCL/src/main/java11/org/jackhuang/hmcl/util/logging/CallerFinder.java +++ b/HMCL/src/main/java11/org/jackhuang/hmcl/util/logging/CallerFinder.java @@ -9,14 +9,13 @@ * @author Glavo */ final class CallerFinder { - private static final StackWalker WALKER = StackWalker.getInstance(); private static final String PACKAGE_PREFIX = CallerFinder.class.getPackageName() + "."; private static final Predicate PREDICATE = stackFrame -> !stackFrame.getClassName().startsWith(PACKAGE_PREFIX); private static final Function, Optional> FUNCTION = stream -> stream.filter(PREDICATE).findFirst(); - private static final Function FRAME_MAPPING = frame -> frame.getClassName() + "." + frame.getMethodName();; + private static final Function FRAME_MAPPING = frame -> frame.getClassName() + "." + frame.getMethodName(); static String getCaller() { - return WALKER.walk(FUNCTION).map(FRAME_MAPPING).orElse(null); + return StackWalker.getInstance().walk(FUNCTION).map(FRAME_MAPPING).orElse(null); } private CallerFinder() {