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)+", ");
    }
}

 

posted @ 2018-06-06 21:52  意犹未尽  阅读(707)  评论(0编辑  收藏  举报