From 43b769923b3c7753d1c361403072c5fd1b66008d Mon Sep 17 00:00:00 2001 From: Glavo Date: Sat, 26 Jul 2025 19:49:05 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=BF=E7=94=A8=20readAllBytes=20=E5=92=8C?= =?UTF-8?q?=20transferTo=20=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81=20(#4115)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hmcl/upgrade/ExecutableHeaderHelper.java | 2 +- .../hmcl/upgrade/IntegrityChecker.java | 4 +- .../AuthlibInjectorServer.java | 4 +- .../download/forge/ForgeOldInstallTask.java | 3 +- .../download/game/LibraryDownloadTask.java | 3 +- .../hmcl/launch/DefaultLauncher.java | 3 +- .../jackhuang/hmcl/util/CacheRepository.java | 5 +- .../hmcl/util/io/HttpMultipartRequest.java | 2 +- .../org/jackhuang/hmcl/util/io/IOUtils.java | 46 ++----------------- .../jackhuang/hmcl/util/tree/TarFileTree.java | 3 +- 10 files changed, 17 insertions(+), 58 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/ExecutableHeaderHelper.java b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/ExecutableHeaderHelper.java index 7c47f586d..01e8a32f5 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/ExecutableHeaderHelper.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/ExecutableHeaderHelper.java @@ -64,7 +64,7 @@ final class ExecutableHeaderHelper { ZipEntry entry = zip.getEntry(location); if (entry != null && !entry.isDirectory()) { try (InputStream in = zip.getInputStream(entry)) { - return Optional.of(IOUtils.readFullyAsByteArray(in)); + return Optional.of(IOUtils.readFully(in)); } } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/IntegrityChecker.java b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/IntegrityChecker.java index 510a59c8a..f1785087c 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/IntegrityChecker.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/IntegrityChecker.java @@ -55,7 +55,7 @@ public final class IntegrityChecker { if (in == null) { throw new IOException("Public key not found"); } - return KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(IOUtils.readFullyAsByteArray(in))); + return KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(IOUtils.readFully(in))); } catch (GeneralSecurityException e) { throw new IOException("Failed to load public key", e); } @@ -76,7 +76,7 @@ public final class IntegrityChecker { } if (SIGNATURE_FILE.equals(filename)) { - signature = IOUtils.readFullyAsByteArray(in); + signature = IOUtils.readFully(in); } else { md.reset(); fileFingerprints.put(filename, DigestUtils.digest(md, in)); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/authlibinjector/AuthlibInjectorServer.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/authlibinjector/AuthlibInjectorServer.java index 93e8987f3..0b8e76965 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/authlibinjector/AuthlibInjectorServer.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/authlibinjector/AuthlibInjectorServer.java @@ -17,6 +17,7 @@ */ package org.jackhuang.hmcl.auth.authlibinjector; +import static java.nio.charset.StandardCharsets.UTF_8; import static java.util.Collections.emptyMap; import static org.jackhuang.hmcl.util.Lang.tryCast; import static org.jackhuang.hmcl.util.logging.Logger.LOG; @@ -32,7 +33,6 @@ import java.util.Optional; import org.jackhuang.hmcl.auth.yggdrasil.YggdrasilService; import org.jackhuang.hmcl.util.io.HttpRequest; -import org.jackhuang.hmcl.util.io.IOUtils; import org.jackhuang.hmcl.util.javafx.ObservableHelper; import org.jetbrains.annotations.Nullable; @@ -77,7 +77,7 @@ public class AuthlibInjectorServer implements Observable { try { AuthlibInjectorServer server = new AuthlibInjectorServer(url); - server.refreshMetadata(IOUtils.readFullyAsStringWithClosing(conn.getInputStream())); + server.refreshMetadata(new String(conn.getInputStream().readAllBytes(), UTF_8)); return server; } finally { conn.disconnect(); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeOldInstallTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeOldInstallTask.java index df3b919ad..6a595b967 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeOldInstallTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeOldInstallTask.java @@ -25,7 +25,6 @@ import org.jackhuang.hmcl.game.Version; import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.util.gson.JsonUtils; import org.jackhuang.hmcl.util.io.FileUtils; -import org.jackhuang.hmcl.util.io.IOUtils; import java.io.*; import java.nio.file.Path; @@ -78,7 +77,7 @@ public class ForgeOldInstallTask extends Task { ZipEntry forgeEntry = zipFile.getEntry(installProfile.getInstall().getFilePath()); try (InputStream is = zipFile.getInputStream(forgeEntry); OutputStream os = new FileOutputStream(forgeFile)) { - IOUtils.copyTo(is, os); + is.transferTo(os); } setResult(installProfile.getVersionInfo() diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/LibraryDownloadTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/LibraryDownloadTask.java index 4e8340990..8970d6bbd 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/LibraryDownloadTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/LibraryDownloadTask.java @@ -26,7 +26,6 @@ import org.jackhuang.hmcl.task.FileDownloadTask.IntegrityCheck; import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.util.DigestUtils; import org.jackhuang.hmcl.util.io.FileUtils; -import org.jackhuang.hmcl.util.io.IOUtils; import java.io.ByteArrayInputStream; import java.io.File; @@ -164,7 +163,7 @@ public class LibraryDownloadTask extends Task { JarInputStream jar = new JarInputStream(new ByteArrayInputStream(data)); JarEntry entry = jar.getNextJarEntry(); while (entry != null) { - byte[] eData = IOUtils.readFullyWithoutClosing(jar); + byte[] eData = jar.readAllBytes(); if (entry.getName().equals("checksums.sha1")) { hashes = new String(eData, StandardCharsets.UTF_8).split("\n"); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java index 4cf983085..3a84c7658 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java @@ -25,7 +25,6 @@ import org.jackhuang.hmcl.util.ServerAddress; import org.jackhuang.hmcl.util.StringUtils; import org.jackhuang.hmcl.util.gson.UUIDTypeAdapter; import org.jackhuang.hmcl.util.io.FileUtils; -import org.jackhuang.hmcl.util.io.IOUtils; import org.jackhuang.hmcl.util.io.Unzipper; import org.jackhuang.hmcl.util.platform.Bits; import org.jackhuang.hmcl.util.platform.*; @@ -420,7 +419,7 @@ public class DefaultLauncher extends Launcher { } try (InputStream input = source; OutputStream output = new FileOutputStream(targetFile)) { - IOUtils.copyTo(input, output); + input.transferTo(output); } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/CacheRepository.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/CacheRepository.java index 77843bbd9..f411f66b7 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/CacheRepository.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/CacheRepository.java @@ -21,7 +21,6 @@ import com.google.gson.JsonParseException; import com.google.gson.annotations.SerializedName; import org.jackhuang.hmcl.util.function.ExceptionalSupplier; import org.jackhuang.hmcl.util.io.FileUtils; -import org.jackhuang.hmcl.util.io.IOUtils; import java.io.FileNotFoundException; import java.io.IOException; @@ -288,7 +287,7 @@ public class CacheRepository { try (FileChannel channel = FileChannel.open(indexFile, StandardOpenOption.CREATE, StandardOpenOption.READ, StandardOpenOption.WRITE)) { FileLock lock = channel.lock(); try { - ETagIndex indexOnDisk = fromMaybeMalformedJson(IOUtils.readFullyAsStringWithClosing(Channels.newInputStream(channel)), ETagIndex.class); + ETagIndex indexOnDisk = fromMaybeMalformedJson(new String(Channels.newInputStream(channel).readAllBytes(), UTF_8), ETagIndex.class); Map newIndex = joinETagIndexes(indexOnDisk == null ? null : indexOnDisk.eTag, index.values()); channel.truncate(0); ByteBuffer writeTo = ByteBuffer.wrap(GSON.toJson(new ETagIndex(newIndex.values())).getBytes(UTF_8)); @@ -424,7 +423,7 @@ public class CacheRepository { try (FileChannel channel = FileChannel.open(indexFile, StandardOpenOption.READ, StandardOpenOption.WRITE)) { FileLock lock = channel.lock(); try { - Map indexOnDisk = fromMaybeMalformedJson(IOUtils.readFullyAsStringWithClosing(Channels.newInputStream(channel)), mapTypeOf(String.class, Object.class)); + Map indexOnDisk = fromMaybeMalformedJson(new String(Channels.newInputStream(channel).readAllBytes(), UTF_8), mapTypeOf(String.class, Object.class)); if (indexOnDisk == null) indexOnDisk = new HashMap<>(); indexOnDisk.putAll(storage); channel.truncate(0); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/HttpMultipartRequest.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/HttpMultipartRequest.java index b0faad09e..b6ff2263a 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/HttpMultipartRequest.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/HttpMultipartRequest.java @@ -52,7 +52,7 @@ public final class HttpMultipartRequest implements Closeable { addLine(String.format("Content-Disposition: form-data; name=\"%s\"; filename=\"%s\"", name, filename)); addLine("Content-Type: " + contentType); addLine(""); - IOUtils.copyTo(inputStream, stream); + inputStream.transferTo(stream); addLine(""); return this; } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/IOUtils.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/IOUtils.java index 723c33128..6e22794b6 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/IOUtils.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/IOUtils.java @@ -62,54 +62,18 @@ public final class IOUtils { } } - /** - * Read all bytes to a buffer from given input stream. The stream will not be closed. - * - * @param stream the InputStream being read. - * @return all bytes read from the stream - * @throws IOException if an I/O error occurs. - */ - public static byte[] readFullyWithoutClosing(InputStream stream) throws IOException { - ByteArrayOutputStream result = new ByteArrayOutputStream(Math.max(stream.available(), 32)); - copyTo(stream, result); - return result.toByteArray(); - } - - public static String readFullyAsStringWithClosing(InputStream stream) throws IOException { - ByteArrayOutputStream result = new ByteArrayOutputStream(Math.max(stream.available(), 32)); - copyTo(stream, result); - return result.toString(UTF_8); - } - - /** - * Read all bytes to a buffer from given input stream, and close the input stream finally. - * - * @param stream the InputStream being read, closed finally. - * @return all bytes read from the stream - * @throws IOException if an I/O error occurs. - */ - public static ByteArrayOutputStream readFully(InputStream stream) throws IOException { - try (InputStream is = stream) { - ByteArrayOutputStream result = new ByteArrayOutputStream(Math.max(is.available(), 32)); - copyTo(is, result); - return result; + public static byte[] readFully(InputStream stream) throws IOException { + try (stream) { + return stream.readAllBytes(); } } - public static byte[] readFullyAsByteArray(InputStream stream) throws IOException { - return readFully(stream).toByteArray(); - } - public static String readFullyAsString(InputStream stream) throws IOException { - return readFully(stream).toString(UTF_8); + return new String(readFully(stream), UTF_8); } public static String readFullyAsString(InputStream stream, Charset charset) throws IOException { - return readFully(stream).toString(charset); - } - - public static void copyTo(InputStream src, OutputStream dest) throws IOException { - copyTo(src, dest, new byte[DEFAULT_BUFFER_SIZE]); + return new String(readFully(stream), charset); } public static void copyTo(InputStream src, OutputStream dest, byte[] buf) throws IOException { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/tree/TarFileTree.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/tree/TarFileTree.java index 152869cb6..0b7cdd359 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/tree/TarFileTree.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/tree/TarFileTree.java @@ -20,7 +20,6 @@ package org.jackhuang.hmcl.util.tree; import kala.compress.archivers.tar.TarArchiveEntry; import kala.compress.archivers.tar.TarArchiveReader; -import org.jackhuang.hmcl.util.io.IOUtils; import java.io.*; import java.nio.file.Files; @@ -42,7 +41,7 @@ public final class TarFileTree extends ArchiveFileTree