- 创建:
// 非池化,使用完后销毁
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方法很重要,切换读写状态。