- 创建:
// 非池化,使用完后销毁
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
等方法可以创建新的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数据类型
//字节数组
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);
});
}
-
ByteBuf
和ByteBuffer
:
-
ByteBuf
使用两个索引readerIndex
、writerIndex
;ByteBuffer
使用position
、limit
、capacity
。 -
ByteBuf
用write
写入数据,用read
读取数据;ByteBuffer
用put
放入数据,用get
读取数据。 -
ByteBuffer
的flip
方法很重要,切换读写状态。