我试图将2 ByteBufs合并成一个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
我可以很容易地合并字节数组,但是我不能合并ByteBufs,我不能调用ByteBuf.array()方法并在生产中创建一个新的具有合并字节数组的ByteBuf (当我调用array()时得到了UnsupportedOperationException: direct buffer )。
发布于 2018-09-03 11:52:03
之所以出现这种情况,是因为您的代码已经读取了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())));或者,您可以在a.resetReaderIndex()之后调用readBytes,将缓冲区“倒带”回开头。
https://stackoverflow.com/questions/52149133
复制相似问题