Netty ByteBuf 缓冲区

  1. ByteBuf 定义
    1. 复制视图

ByteBuf 定义

Netty 的 数据缓冲区是在 java nio ByteBuffer 封装的

它在 ByteBuffer 的基础上扩展了:

  • 自动扩容。写的时候超过 capacity 会自动扩容,但不可能超过 max capacity(常量)
  • 读写双索引(原单索引),不需要flip

代码示例

@Test
public void t1() {

    // 初始化长度5,最大容量1000
    ByteBuf byteBuf = Unpooled.buffer(5, 1000);

    // 分别占1个字节
    byteBuf.writeByte((byte)1);
    byteBuf.writeBytes("a".getBytes());

    // 分别占3个字节
    byteBuf.writeBytes("你".getBytes());
    byteBuf.writeBytes("好".getBytes());
    byteBuf.writeBytes("啊".getBytes());

    // 占4个字节
    byteBuf.writeInt(1);

    // 占2个字节
    byteBuf.writeShort(2);

    // 占1个字节
    byteBuf.writeBoolean(true);

    System.out.println(byteBuf.readableBytes()); // 输出 11

    // 读取字节,读索引会推进一个
    System.out.println(byteBuf.readByte()); // 输出 1

    // 读取字节,读索引会推进一个
    byte[] a = {byteBuf.readByte()};
    System.out.println(new String(a)); // 输出 a

    // 读取字节,我们读三个,把中文读取出来
    byte[] n = {byteBuf.readByte(), byteBuf.readByte(), byteBuf.readByte()};
    System.out.println(new String(n)); // 输出 你

    // 回收已读空间,就是上面索引0
    byteBuf.discardReadBytes();

    // 可读字节数
    System.out.println(byteBuf.readableBytes()); // 输出 6

}

自动回收已读取的空间 17.55

复制视图

@Test
public void t2() {

    // 快速构建一个 ByteBuf
    ByteBuf byteBuf = Unpooled.wrappedBuffer(new byte[]{1, 2, 3, 4, 5});

    // 复制出一个视图,独立的读写索引,但是数据还是共享的(理解成 MySql 视图)
    ByteBuf duplicate = byteBuf.duplicate();
    System.out.println(duplicate.readByte());

    // 复制可读数据
    ByteBuf slice = byteBuf.slice();

    // 复制可读数据,同时读指针会推进4
    ByteBuf readSlice = byteBuf.readSlice(4);

    // 完全复制出一个全新的缓冲区
    ByteBuf copy = byteBuf.copy();

}

转载请注明来源。 欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。 可以在下面评论区评论,也可以邮件至 sharlot2050@foxmail.com。

文章标题:Netty ByteBuf 缓冲区

字数:405

本文作者:夏来风

发布时间:2020-07-26, 10:07:58

原始链接:http://www.demo1024.com/blog/netty-ByteBuf/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。