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

This commit is contained in:
Looly
2026-02-01 20:19:10 +08:00
parent c0bb9675b2
commit 9c35fa9e3f
3 changed files with 88 additions and 5 deletions

View File

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

View File

@@ -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} 工具类<br>
@@ -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));
}
/**

View File

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