可以将多个 ByteBuf 合并为一个逻辑上的 ByteBuf,避免拷贝

    有两个 ByteBuf 如下

    1. ByteBuf buf1 = ByteBufAllocator.DEFAULT.buffer(5);
    2. buf1.writeBytes(new byte[]{1, 2, 3, 4, 5});
    3. ByteBuf buf2 = ByteBufAllocator.DEFAULT.buffer(5);
    4. buf2.writeBytes(new byte[]{6, 7, 8, 9, 10});
    5. System.out.println(ByteBufUtil.prettyHexDump(buf1));
    6. System.out.println(ByteBufUtil.prettyHexDump(buf2));

    输出

    1. +-------------------------------------------------+
    2. | 0 1 2 3 4 5 6 7 8 9 a b c d e f |
    3. +--------+-------------------------------------------------+----------------+
    4. |00000000| 01 02 03 04 05 |..... |
    5. +--------+-------------------------------------------------+----------------+
    6. +-------------------------------------------------+
    7. | 0 1 2 3 4 5 6 7 8 9 a b c d e f |
    8. +--------+-------------------------------------------------+----------------+
    9. |00000000| 06 07 08 09 0a |..... |
    10. +--------+-------------------------------------------------+----------------+

    现在需要一个新的 ByteBuf,内容来自于刚才的 buf1 和 buf2,如何实现?

    方法1:

    1. ByteBuf buf3 = ByteBufAllocator.DEFAULT
    2. .buffer(buf1.readableBytes()+buf2.readableBytes());
    3. buf3.writeBytes(buf1);
    4. buf3.writeBytes(buf2);
    5. System.out.println(ByteBufUtil.prettyHexDump(buf3));

    结果

    1. +-------------------------------------------------+
    2. | 0 1 2 3 4 5 6 7 8 9 a b c d e f |
    3. +--------+-------------------------------------------------+----------------+
    4. |00000000| 01 02 03 04 05 06 07 08 09 0a |.......... |
    5. +--------+-------------------------------------------------+----------------+

    这种方法好不好?回答是不太好,因为进行了数据的内存复制操作

    方法2:

    1. CompositeByteBuf buf3 = ByteBufAllocator.DEFAULT.compositeBuffer();
    2. // true 表示增加新的 ByteBuf 自动递增 write index, 否则 write index 会始终为 0
    3. buf3.addComponents(true, buf1, buf2);

    结果是一样的

    1. +-------------------------------------------------+
    2. | 0 1 2 3 4 5 6 7 8 9 a b c d e f |
    3. +--------+-------------------------------------------------+----------------+
    4. |00000000| 01 02 03 04 05 06 07 08 09 0a |.......... |
    5. +--------+-------------------------------------------------+----------------+

    CompositeByteBuf 是一个组合的 ByteBuf,它内部维护了一个 Component 数组,每个 Component 管理一个 ByteBuf,记录了这个 ByteBuf 相对于整体偏移量等信息,代表着整体中某一段的数据。

    • 优点,对外是一个虚拟视图,组合这些 ByteBuf 不会产生内存复制
    • 缺点,复杂了很多,多次操作会带来性能的损耗