首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何合并2 ByteBufs?

如何合并2 ByteBufs?
EN

Stack Overflow用户
提问于 2018-09-03 11:42:59
回答 1查看 1K关注 0票数 2

我试图将2 ByteBufs合并成一个ByteBuf,我如何才能做到这一点呢?

代码语言:javascript
复制
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 )。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-03 11:52:03

之所以出现这种情况,是因为您的代码已经读取了a的所有四个字节:

代码语言:javascript
复制
a.readBytes(byteArray);

此时,a的读取索引已经超过了数据的末尾,因此没有一个字节被复制。

在读取之前放置用于复制缓冲区的代码可以解决以下问题:

代码语言:javascript
复制
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,将缓冲区“倒带”回开头。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52149133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档