- 創(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
- 可以調用如下方法獲取
readerIndex和writerIndex:
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,其readerIndex和writerIndex是獨立的,但是數據和原來的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種類型:
- Heap ,堆上
- Direct,不在JVM堆上,而在OS的本地內存上
- 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);
});
}
-
ByteBuf和ByteBuffer:
-
ByteBuf使用兩個索引readerIndex、writerIndex;ByteBuffer使用position、limit、capacity。 -
ByteBuf用write寫入數據,用read讀取數據;ByteBuffer用put放入數據,用get讀取數據。 -
ByteBuffer的flip方法很重要,切換讀寫狀態(tài)。