美文网首页Netty源码分析系列
Netty源码分析系列--15. ByteBuf

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

作者: ted005 | 来源:发表于2018-11-23 13:25 被阅读10次
    • 创建:
    // 非池化,使用完后销毁
    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

        本文链接:https://www.haomeiwen.com/subject/oyljqqtx.html