diff --git a/hutool-core/src/main/java/cn/hutool/v7/core/io/buffer/BufferUtil.java b/hutool-core/src/main/java/cn/hutool/v7/core/io/buffer/BufferUtil.java index 01b15f8111..20c77b042f 100644 --- a/hutool-core/src/main/java/cn/hutool/v7/core/io/buffer/BufferUtil.java +++ b/hutool-core/src/main/java/cn/hutool/v7/core/io/buffer/BufferUtil.java @@ -95,7 +95,7 @@ public class BufferUtil { * @return 新的ByteBuffer */ public static ByteBuffer copy(final ByteBuffer src, final int start, final 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/v7/core/io/buffer/BufferUtilTest.java b/hutool-core/src/test/java/cn/hutool/v7/core/io/buffer/BufferUtilTest.java index a2165ca51c..a71ccf062c 100644 --- a/hutool-core/src/test/java/cn/hutool/v7/core/io/buffer/BufferUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/v7/core/io/buffer/BufferUtilTest.java @@ -18,11 +18,12 @@ package cn.hutool.v7.core.io.buffer; import cn.hutool.v7.core.text.StrUtil; import cn.hutool.v7.core.util.CharsetUtil; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import java.nio.ByteBuffer; +import static org.junit.jupiter.api.Assertions.*; + /** * BufferUtil单元测试 * @@ -37,7 +38,7 @@ public class BufferUtilTest { final ByteBuffer buffer = ByteBuffer.wrap(bytes); final ByteBuffer buffer2 = BufferUtil.copy(buffer, ByteBuffer.allocate(5)); - Assertions.assertEquals("AAABB", StrUtil.utf8Str(buffer2)); + assertEquals("AAABB", StrUtil.utf8Str(buffer2)); } @Test @@ -46,7 +47,7 @@ public class BufferUtilTest { final ByteBuffer buffer = ByteBuffer.wrap(bytes); final byte[] bs = BufferUtil.readBytes(buffer, 5); - Assertions.assertEquals("AAABB", StrUtil.utf8Str(bs)); + assertEquals("AAABB", StrUtil.utf8Str(bs)); } @Test @@ -55,7 +56,7 @@ public class BufferUtilTest { final ByteBuffer buffer = ByteBuffer.wrap(bytes); final byte[] bs = BufferUtil.readBytes(buffer, 5); - Assertions.assertEquals("AAABB", StrUtil.utf8Str(bs)); + assertEquals("AAABB", StrUtil.utf8Str(bs)); } @Test @@ -65,17 +66,97 @@ public class BufferUtilTest { // 第一行 String line = BufferUtil.readLine(buffer, CharsetUtil.UTF_8); - Assertions.assertEquals("aa", line); + assertEquals("aa", line); // 第二行 line = BufferUtil.readLine(buffer, CharsetUtil.UTF_8); - Assertions.assertEquals("bbb", line); + assertEquals("bbb", line); // 第三行因为没有行结束标志,因此返回null line = BufferUtil.readLine(buffer, CharsetUtil.UTF_8); - Assertions.assertNull(line); + assertNull(line); // 读取剩余部分 - Assertions.assertEquals("cc", StrUtil.utf8Str(BufferUtil.readBytes(buffer))); + assertEquals("cc", StrUtil.utf8Str(BufferUtil.readBytes(buffer))); + } + + /** + * 测试正常范围内的拷贝功能 + */ + @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); } }