From e98c7dfef1a848e2f4a51bdb470e0c839bcaa481 Mon Sep 17 00:00:00 2001 From: Glavo Date: Sun, 27 Apr 2025 15:41:09 +0800 Subject: [PATCH] =?UTF-8?q?Fix=20#3400:=20=E9=80=90=E8=A1=8C=E8=BF=87?= =?UTF-8?q?=E6=BB=A4=E6=97=A5=E5=BF=97=E4=B8=AD=E7=9A=84=20token=20(#3856)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/jackhuang/hmcl/game/LogExporter.java | 7 +++-- .../org/jackhuang/hmcl/util/io/Zipper.java | 27 ++++++++++++++++--- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/LogExporter.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/LogExporter.java index 4474750e3..454442c8d 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/LogExporter.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/LogExporter.java @@ -19,10 +19,10 @@ package org.jackhuang.hmcl.game; import org.jackhuang.hmcl.util.logging.Logger; import org.jackhuang.hmcl.util.StringUtils; -import org.jackhuang.hmcl.util.io.FileUtils; import org.jackhuang.hmcl.util.io.Zipper; import org.jackhuang.hmcl.util.platform.OperatingSystem; +import java.io.BufferedReader; import java.io.IOException; import java.io.UncheckedIOException; import java.lang.management.ManagementFactory; @@ -93,9 +93,8 @@ public final class LogExporter { if (Files.isRegularFile(file)) { FileTime time = Files.readAttributes(file, BasicFileAttributes.class).lastModifiedTime(); if (time.toMillis() >= processStartTime) { - try { - String crashLog = Logger.filterForbiddenToken(FileUtils.readText(file, OperatingSystem.NATIVE_CHARSET)); - zipper.putTextFile(crashLog, file.getFileName().toString()); + try (BufferedReader reader = Files.newBufferedReader(file, OperatingSystem.NATIVE_CHARSET)) { + zipper.putLines(reader.lines().map(Logger::filterForbiddenToken), file.getFileName().toString()); } catch (IOException e) { LOG.warning("Failed to read log file: " + file, e); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/Zipper.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/Zipper.java index f1376b65d..023ad1ca8 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/Zipper.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/Zipper.java @@ -19,14 +19,12 @@ package org.jackhuang.hmcl.util.io; import org.jackhuang.hmcl.util.function.ExceptionalPredicate; -import java.io.Closeable; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; +import java.io.*; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.nio.file.*; import java.nio.file.attribute.BasicFileAttributes; +import java.util.stream.Stream; import java.util.zip.ZipEntry; import java.util.zip.ZipException; import java.util.zip.ZipOutputStream; @@ -155,6 +153,27 @@ public final class Zipper implements Closeable { zos.closeEntry(); } + public void putLines(Stream lines, String path) throws IOException { + zos.putNextEntry(new ZipEntry(normalize(path))); + + try { + BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(zos)); + lines.forEachOrdered(line -> { + try { + writer.write(line); + writer.write('\n'); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + }); + writer.flush(); + } catch (UncheckedIOException e) { + throw e.getCause(); + } finally { + zos.closeEntry(); + } + } + public void putTextFile(String text, String path) throws IOException { putTextFile(text, StandardCharsets.UTF_8, path); }