diff --git a/CHANGELOG.md b/CHANGELOG.md index 0212872121..2ceba7f8b2 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ * 【extra 】 修复`MailAccount.setAuth`参数与field不一致问题(issue#4217@Github) * 【core 】 修复`TransMap.computeIfAbsent`mappingFunction处理不一致问题(issue#IDM6UR@Gitee) * 【core 】 修复`MultiResource`游标歧义问题(issue#IDNAOY@Gitee) +* 【core 】 修复`BufferUtil`copy歧义问题(issue#IDN097@Gitee) ------------------------------------------------------------------------------------------------------------- # 5.8.43(2026-01-04) diff --git a/hutool-core/src/main/java/cn/hutool/core/io/BufferUtil.java b/hutool-core/src/main/java/cn/hutool/core/io/BufferUtil.java index f4e8157a51..ceed6fa6d0 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/BufferUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/BufferUtil.java @@ -6,6 +6,7 @@ import cn.hutool.core.util.StrUtil; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.charset.Charset; +import java.util.Arrays; /** * {@link ByteBuffer} 工具类
@@ -26,7 +27,7 @@ public class BufferUtil { * @return 新的ByteBuffer */ public static ByteBuffer copy(ByteBuffer src, int start, int end) { - return copy(src, ByteBuffer.allocate(end - start)); + return ByteBuffer.wrap(Arrays.copyOfRange(src.array(), start, end)); } /** 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 c53dcd7ff8..dfad8facd8 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,13 +1,14 @@ package cn.hutool.core.io; +import cn.hutool.core.util.CharsetUtil; +import cn.hutool.core.util.StrUtil; +import org.junit.jupiter.api.Test; + import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import static org.junit.jupiter.api.Assertions.*; -import org.junit.jupiter.api.Test; - -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.core.util.StrUtil; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; /** * BufferUtil单元测试 @@ -81,4 +82,84 @@ public class BufferUtilTest { // 再次调用工具类转换,输出结果应该不变 assertEquals(originalText, StrUtil.str(buffer, StandardCharsets.UTF_8)); } + + /** + * 测试正常范围内的拷贝功能 + */ + @Test + public void copyNormalRangeTest() { + // 准备测试数据 + final byte[] originalData = {65, 66, 67, 68, 69, 70}; // 对应 "ABCDEF" + final ByteBuffer srcBuffer = ByteBuffer.wrap(originalData); + + // 执行拷贝操作,从索引1到4(不包含4),即拷贝BCD + final ByteBuffer resultBuffer = BufferUtil.copy(srcBuffer, 1, 4); + + // 验证结果 + final byte[] resultArray = new byte[3]; + resultBuffer.get(resultArray); + assertArrayEquals(new byte[]{66, 67, 68}, resultArray); // BCD + } + + /** + * 测试从开头开始拷贝 + */ + @Test + public void copyFromStartTest() { + final byte[] originalData = {65, 66, 67, 68, 69, 70}; // 对应 "ABCDEF" + final ByteBuffer srcBuffer = ByteBuffer.wrap(originalData); + + // 从索引0拷贝到3,即拷贝ABC + final ByteBuffer resultBuffer = BufferUtil.copy(srcBuffer, 0, 3); + + final byte[] resultArray = new byte[3]; + resultBuffer.get(resultArray); + assertArrayEquals(new byte[]{65, 66, 67}, resultArray); // ABC + } + + /** + * 测试拷贝到末尾 + */ + @Test + public void copyToEndTest() { + final byte[] originalData = {65, 66, 67, 68, 69, 70}; // 对应 "ABCDEF" + final ByteBuffer srcBuffer = ByteBuffer.wrap(originalData); + + // 从索引3拷贝到末尾,即拷贝DEF + final ByteBuffer resultBuffer = BufferUtil.copy(srcBuffer, 3, 6); + + final byte[] resultArray = new byte[3]; + resultBuffer.get(resultArray); + assertArrayEquals(new byte[]{68, 69, 70}, resultArray); // DEF + } + + /** + * 测试空拷贝(start等于end) + */ + @Test + public void copyEmptyRangeTest() { + final byte[] originalData = {65, 66, 67, 68, 69, 70}; // 对应 "ABCDEF" + final ByteBuffer srcBuffer = ByteBuffer.wrap(originalData); + + // 拷贝相同起始和结束位置,应该得到空数组 + final ByteBuffer resultBuffer = BufferUtil.copy(srcBuffer, 2, 2); + + assertEquals(0, resultBuffer.remaining()); // 应该为空 + } + + /** + * 测试整个数组的拷贝 + */ + @Test + public void copyFullRangeTest() { + final byte[] originalData = {65, 66, 67, 68, 69, 70}; // 对应 "ABCDEF" + final ByteBuffer srcBuffer = ByteBuffer.wrap(originalData); + + // 拷贝整个数组 + final ByteBuffer resultBuffer = BufferUtil.copy(srcBuffer, 0, 6); + + final byte[] resultArray = new byte[6]; + resultBuffer.get(resultArray); + assertArrayEquals(originalData, resultArray); + } }