首页 > 解决方案 > 如何合并 2 个 ByteBuf?

问题描述

我正在尝试将 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]

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

标签: javanetty

解决方案


发生这种情况是因为您的代码已经读取了所有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()afterreadBytes将缓冲区“倒回”到开头。


推荐阅读