From a6151b6ee81c6406a6a4bc4d21b2f49c109bcabf Mon Sep 17 00:00:00 2001 From: Will <5499819+guizhonglin@user.noreply.gitee.com> Date: Tue, 25 Nov 2025 18:08:03 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DStrUtil.str(ByteBuffer,=20Cha?= =?UTF-8?q?rset)=20=E6=96=B9=E6=B3=95=E4=BF=AE=E6=94=B9=E5=85=A5=E5=8F=82?= =?UTF-8?q?=20ByteBuffer=20=E7=9A=84=20position=EF=BC=8C=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E5=85=A5=E5=8F=82=E5=8F=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/cn/hutool/core/util/StrUtil.java | 2 +- .../java/cn/hutool/core/io/BufferUtilTest.java | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/util/StrUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/StrUtil.java index f37eb27e8..deecb0665 100755 --- a/hutool-core/src/main/java/cn/hutool/core/util/StrUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/StrUtil.java @@ -261,7 +261,7 @@ public class StrUtil extends CharSequenceUtil implements StrPool { if (null == charset) { charset = Charset.defaultCharset(); } - return charset.decode(data).toString(); + return charset.decode(data.duplicate()).toString(); } /** diff --git a/hutool-core/src/test/java/cn/hutool/core/io/BufferUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/io/BufferUtilTest.java index bc2755eea..c53dcd7ff 100644 --- a/hutool-core/src/test/java/cn/hutool/core/io/BufferUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/io/BufferUtilTest.java @@ -1,6 +1,7 @@ package cn.hutool.core.io; import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; import static org.junit.jupiter.api.Assertions.*; import org.junit.jupiter.api.Test; @@ -63,4 +64,21 @@ public class BufferUtilTest { // 读取剩余部分 assertEquals("cc", StrUtil.utf8Str(BufferUtil.readBytes(buffer))); } + + @Test + public void testByteBufferSideEffect() { + String originalText = "Hello"; + ByteBuffer buffer = ByteBuffer.wrap(originalText.getBytes(StandardCharsets.UTF_8)); + // 此时 buffer.remaining() == 5 + assertEquals(5, buffer.remaining()); + + // 调用工具类转换,打印buffer内容 + String result = StrUtil.str(buffer, StandardCharsets.UTF_8); + assertEquals(originalText, result); + + // 预期: + // 工具类不应该修改原 buffer 的指针,remaining 应该依然为 5 + // 再次调用工具类转换,输出结果应该不变 + assertEquals(originalText, StrUtil.str(buffer, StandardCharsets.UTF_8)); + } }