netty byteBuf (二)
netty重新定义了byteBuf 而没使用jdk byteBuffer
netty byteBuf与jdk byteBuffer的区别
(1)jdk buffer长度固定 byteBuf超过最大索引 将会扩容。(最大值默认值是Integer.MAXVALUE)
(4)读取和写入的索引分开了(readIndex/WriterIndex),不像JDK中使用一个索引
优点:
jdk 读写都是一个索引 节省了变量 读时都需要调用flip切换 写入时需要clear清空 读时不能写(nettyBuf反之)
(5)基于对象池
避免频繁的gc 内部维护一个 内存池可以频繁的利用创建buffer
netty中的byteBuf的几种类型
heapBuffer(堆缓冲区)
ByteBuf将数据存储在JVM的堆空间,通过将数据存储在数组中实现的。
1)堆缓冲的优点是:由于数据存储在JVM的堆中可以快速创建和快速释放,并且提供了数组的直接快速访问的方法。
2)堆缓冲缺点是:每次读写数据都要先将数据拷贝到直接缓冲区再进行传递。
directBuffer(直接缓存区)
优点: 因为数据直接在内存中 不会存在将数据拷贝到直接缓冲区的步骤。
缺点 :因为在直接内存中分配和释放空间会更慢
composite Buffer(复合缓冲区类型)
将多个缓存区组合成一个缓冲区。而不是创建一个缓冲区 将多个缓存区的数据复制到这个缓冲区
//组合缓冲区 CompositeByteBuf compBuf = Unpooled.compositeBuffer(); //堆缓冲区 ByteBuf heapBuf = Unpooled.buffer(8); //直接缓冲区 ByteBuf directBuf = Unpooled.directBuffer(16); //添加ByteBuf到CompositeByteBuf compBuf.addComponents(heapBuf, directBuf); //删除第一个ByteBuf compBuf.removeComponent(0); Iterator<ByteBuf> iter = compBuf.iterator(); while(iter.hasNext()){ System.out.println(iter.next().toString()); } //使用数组访问数据 if(!compBuf.hasArray()){ int len = compBuf.readableBytes(); byte[] arr = new byte[len]; compBuf.getBytes(0, arr); }
ByteBuf读写操作
public static void main(String[] args) { //创建一个16字节的buffer,这里默认是创建heap buffer ByteBuf buf = Unpooled.buffer(16); //写数据到buffer for(int i=0; i<16; i++){ buf.writeByte(i+1); } //读数据 for(int i=0; i<buf.capacity(); i++){ System.out.print(buf.getByte(i)+", "); } }