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

  • 創(chuàng)建:
// 非池化,使用完后銷毀
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的視圖

通過duplicate,slice等方法可以創(chuàng)建新的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數據類型
//字節(jié)數組
if (byteBuf.hasArray()) {
    byte[] bytes = byteBuf.array();
}

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

//String
byteBuf.toString(Charset.forName("utf-8"));
  • 復合緩沖區(qū)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使用兩個索引readerIndexwriterIndex;ByteBuffer使用position、limitcapacity。
  2. ByteBufwrite寫入數據,用read讀取數據;ByteBufferput放入數據,用get讀取數據。
  3. ByteBufferflip方法很重要,切換讀寫狀態(tài)。
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容