Netty源码分析系列--15. ByteBuf

  • 创建:
// 非池化,使用完后销毁
ByteBuf byteBuf = Unpooled.buffer(10);

//复合类型
CompositeByteBuf compositeByteBuf = Unpooled.compositeBuffer();
  • 当向ByteBuf写入部分数据后,writerIndex会增加;当从ByteBuf中读取部分数据时,readerIndex增加。显然,readableBytes的值等于writerIndex - readerIndex
| discardable bytes |  readable bytes  |  writable bytes  |

0      <=      readerIndex   <=   writerIndex    <=    capacity
  • 可以调用如下方法获取readerIndexwriterIndex:
int writerIndex = byteBuf.writerIndex();
int readerIndex = byteBuf.readerIndex();
  • 可读取
public boolean isReadable() {
    return writerIndex > readerIndex;
}
  • 可写入
public boolean isWritable() {
    return capacity() > writerIndex;
}
  • 调用clear之后,索引重置:
readerIndex == writerIndex == 0
  • ByteBuf的视图

通过duplicateslice等方法可以创建新的ByteBuf,其readerIndexwriterIndex是独立的,但是数据和原来的ByteBuf是共享的。

  • 简单示例
public static void main(String[] args) {

    ByteBuf byteBuf = Unpooled.buffer(10);

    // 写入数据
    for (int i = 0; i < 10; i++) {
        byteBuf.writeByte(i);
    }

    // 读取数据
    while (byteBuf.isReadable()) {
        System.out.println(byteBuf.readByte());
    }

}
  • ByteBuf的3种类型:
  1. Heap ,堆上
  2. Direct,不在JVM堆上,而在OS的本地内存上
  3. Composite
  • 转换为JDK数据类型
//字节数组
if (byteBuf.hasArray()) {
    byte[] bytes = byteBuf.array();
}

//ByteBuffer
if (byteBuf.nioBufferCount() > 0) {
    ByteBuffer byteBuffer = byteBuf.nioBuffer();
}

//String
byteBuf.toString(Charset.forName("utf-8"));
  • 复合缓冲区CompositeByteBuf
public static void main(String[] args) {
    CompositeByteBuf compositeByteBuf = Unpooled.compositeBuffer();

    ByteBuf byteBuf = Unpooled.buffer(10);
    ByteBuf directBuffer = Unpooled.directBuffer(10);

    compositeByteBuf.addComponent(byteBuf);
    compositeByteBuf.addComponent(directBuffer);

    compositeByteBuf.forEach(e -> {
        System.out.println(e);
    });
}
  • ByteBufByteBuffer
  1. ByteBuf使用两个索引readerIndexwriterIndexByteBuffer使用positionlimitcapacity
  2. ByteBufwrite写入数据,用read读取数据;ByteBufferput放入数据,用get读取数据。
  3. ByteBufferflip方法很重要,切换读写状态。

你可能感兴趣的:(Netty源码分析系列--15. ByteBuf)