zoukankan      html  css  js  c++  java
  • 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)+", ");
        }
    }
  • 相关阅读:
    Mysql update case
    phpexcel导出excel等比例缩放图片
    phpexcel错误 You tried to set a sheet active by the out of bounds index: 1解决办法
    phpexcel操作
    Java io基础
    java线程基础
    java 集合基础(适用单线程)
    java 泛型深入
    Java反射基础
    Java泛型基础
  • 原文地址:https://www.cnblogs.com/LQBlog/p/9147576.html
Copyright © 2011-2022 走看看