Netty源码分析系列

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

2018-11-23  本文已影响10人  ted005
// 非池化,使用完后销毁
ByteBuf byteBuf = Unpooled.buffer(10);

//复合类型
CompositeByteBuf compositeByteBuf = Unpooled.compositeBuffer();
| discardable bytes |  readable bytes  |  writable bytes  |

0      <=      readerIndex   <=   writerIndex    <=    capacity
int writerIndex = byteBuf.writerIndex();
int readerIndex = byteBuf.readerIndex();
public boolean isReadable() {
    return writerIndex > readerIndex;
}
public boolean isWritable() {
    return capacity() > writerIndex;
}
readerIndex == writerIndex == 0

通过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());
    }

}
  1. Heap ,堆上
  2. Direct,不在JVM堆上,而在OS的本地内存上
  3. Composite
//字节数组
if (byteBuf.hasArray()) {
    byte[] bytes = byteBuf.array();
}

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

//String
byteBuf.toString(Charset.forName("utf-8"));
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);
    });
}
  1. ByteBuf使用两个索引readerIndexwriterIndexByteBuffer使用positionlimitcapacity
  2. ByteBufwrite写入数据,用read读取数据;ByteBufferput放入数据,用get读取数据。
  3. ByteBufferflip方法很重要,切换读写状态。
上一篇 下一篇

猜你喜欢

热点阅读