修复BufferUtilcopy歧义问题(issue#IDN097@Gitee)

This commit is contained in:
Looly
2026-02-01 20:19:05 +08:00
parent cb10513f6f
commit 79311c0806
2 changed files with 90 additions and 9 deletions

View File

@@ -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));
}
/**

View File

@@ -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);
}
}