Netty CompositeByteBuf具有readableBytes返回0

Netty CompositeByteBuf具有readableBytes返回0,netty,Netty,以下代码有什么问题?它总是为readableBytes打印0,即使CompositeByteBuf中显然有数据 private void compositeTest() { ByteBuf buf1 = Unpooled.buffer(1024); buf1.writeBytes("hello".getBytes(StandardCharsets.UTF_8)); ByteBuf buf2 = Unpooled.buffer(1024);

以下代码有什么问题?它总是为readableBytes打印0,即使CompositeByteBuf中显然有数据

    private void compositeTest() {
       ByteBuf buf1 = Unpooled.buffer(1024);
       buf1.writeBytes("hello".getBytes(StandardCharsets.UTF_8));
       ByteBuf buf2 = Unpooled.buffer(1024);
       buf2.writeBytes("world".getBytes(StandardCharsets.UTF_8));

       CompositeByteBuf composite = Unpooled.compositeBuffer();
       composite.addComponent(buf1);
       composite.addComponent(buf2);

       System.out.println("Number of components " + composite.numComponents() +
                          ", Composite readable bytes: " +
                          composite.readableBytes()); 

       }
最后一个print语句将打印:

组件数量2,复合可读字节:0

我在pom.xml中使用这个:

    <dependency>
        <groupId>io.netty</groupId>
        <artifactId>netty-all</artifactId>
        <version>4.0.34.Final</version>
    </dependency>

伊奥·内蒂
讨厌的
4.0.34.1决赛
给出了什么?

readableBytes()
计算为缓冲区
writerIndex-readerIndex
。如果调用
composite.writerIndex()
,您会注意到它也返回0

查看
addComponent()
的文档:

请注意,此方法不会增加CompositeByteBuf的writerIndex。如果需要增加,您需要自己处理。

要使其正常工作,您可以手动设置
writerIndex()

composite.writerIndex(buf1.writerIndex()+buf2.writerIndex())


您可能希望使用
unmooled.wrappedBuffer()
,这将为您完成此操作。

您可以将
addComponent(布尔递增WriterIndex,ByteBuf buffer)
与netty-4.1.x一起使用,当方法参数
increaseWriterIndex
设置为true时,它可以为您完成此操作。

尽管有文档记录,但非常混乱。如果CompositeBuffer不能提供零件的合并视图,那么它有什么意义呢。文档甚至说:“一个虚拟缓冲区,它将多个缓冲区显示为一个合并的缓冲区。”