gpt4 book ai didi

java - 如何合并 2 个 ByteBuf?

转载 作者:行者123 更新时间:2023-11-29 04:16:18 29 4
gpt4 key购买 nike

我正在尝试将 2 个 ByteBuf 合并为一个 ByteBuf,我该怎么做?

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import org.apache.commons.lang3.ArrayUtils;

import java.util.Arrays;

public class Main {

public static void main(String[] args) {
ByteBuf a = Unpooled.buffer(4).writeByte(33).writeByte(44).writeByte(55).writeByte(66);
ByteBuf b = Unpooled.buffer(4).writeByte(77).writeByte(88).writeByte(99).writeByte(22);

byte[] byteArray = new byte[4];
a.readBytes(byteArray);

System.out.println(Arrays.toString(ArrayUtils.addAll(byteArray, b.array())));
System.out.println(Arrays.toString(
Unpooled.copiedBuffer(a, b).array()
));
}
}

上面的代码打印

[33, 44, 55, 66, 77, 88, 99, 22]

[77, 88, 99, 22]

我可以轻松地合并字节数组,但我无法合并 ByteBuf,我无法调用 ByteBuf.array() 方法并在生产中创建一个带有合并字节数组的新 ByteBuf(我得到 UnsupportedOperationException: direct buffer 当我调用 array() 时)

最佳答案

发生这种情况是因为您的代码已经读取了所有a 的四个字节:

a.readBytes(byteArray);

此时 a 的读取索引已超过数据末尾,因此其字节均未被复制。

在读取之前放置复制缓冲区的代码修复了这个问题:

System.out.println(Arrays.toString(
Unpooled.copiedBuffer(a, b).array()
));
byte[] byteArray = new byte[4];
a.readBytes(byteArray);
System.out.println(Arrays.toString(ArrayUtils.addAll(byteArray, b.array())));

或者,您可以在 readBytes 之后调用 a.resetReaderIndex() 以将缓冲区“倒回”到开头。

关于java - 如何合并 2 个 ByteBuf?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52149133/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com