1. 概念
Java NIO API自带的缓冲区类功能相当有限,没有经过优化,使用JDK的ByteBuffer操作更复杂。故而Netty的作者Trustin Lee为了实现高效率的网络传输,重新造轮子,Netty中的ByteBuf实际上就相当于JDK中的ByteBuffer,其作用是在Netty中通过Channel传输数据。
2. 优势
可以自定义缓冲类型;
通过内置的复合缓冲类型,实现透明的零拷贝(zero-copy);
不需要调用flip()来切换读/写模式;
读取和写入索引分开;
方法链;
引用计数;
Pooling(池)。
3. 实现机制
ByteBuf实际上是在一个抽象的字节数组byte[]上进行读/写操作的集合。它提供了两个指针变量用来支持读写操作:readerIndex和writerIndex。下图展现了如何将一个buffer利用两个指针来划分为三个区域。
由此可见,ByteBuf真正可读取的内容长度是writerIndex - readerIndex。
围绕着读和写操作,接下来分析ByteBuf的实现逻辑。
3.1 读操作
读操作主要提供以下功能:
readByte:取1字节的内容;
readBoolean:取1字节的内容,返回readByte()!= 0;
readUnsignedByte:取1字节的内容,返回((short) (readByte() & 0xFF));(能把负数转换为无符号吗?)
readShort:取2字节的内容,返回转换后的short类型;
readUnsignedShort:取2字节的内容,返回readShort()& 0xFFFF;
readMedium:取3字节的内容,返回转换后的int类型;
readUnsignedMedium:取3字节的内容,返回转换后的int类型;
readInt:取4字节的内容;
readUnsignedInt:取4字节的内容,返回readInt()& 0xFFFFFFFFL;
readLong:取8字节的内容;
readChar:取1字节的内容;
readFloat:取4字节的int内容,转换为float类型;
readDouble:取8字节的long内容,转换为double类型;
readBytes:取指定长度的内容,返回ByteBuf类型;
readSlice:取指定长度的内容,返回By