Java ByteBuffer flip()、compact()

390 阅读1分钟
  1. 创建字节缓冲区
ByteBuffer.allocate(int capacity);

// allocateDirect() 在本机内存中创建缓存,即在Java堆内存外创建缓存。本机内存的优点是可以更快的执行读取和写入操作。原因是相应的操作系统操作可以直接访问这块内存区域,而不必现在Java堆和操作系统之间进行数据交换。这种方法的缺点是较高的分配和接触分配成本
ByteBuffer.allocateDirect(int capacity);
  1. ByteBuffer位置、限制和容量
    • position 是读/写位置。对于新缓冲区,始终为0;
    • limit有两个含义:当写入缓冲区时,指示可以写入的位置;从缓冲区读取时,指示缓冲区包含数据的位置。最初,ByteBuffer处于写入模式,limit=capacity;
    • capacity以字节为单位指定缓冲区的大小;
  2. ByteBuffer读写周期
    • put()方法可以将单个字节、字节数组或其他原始类型(char,double,float,int,long,shourt)写入缓冲区
    • flip()方法切换到读取模式,从缓冲区读取,有对应的get()方法
    buffer.limit(buffer.position());
    buffer.position(0);
    //每次从写入模式切换到读取模式时都需要将limit设置为最多可以从缓冲区中读取的字节数,position重新设置为0。
    buffer.flip();
    
    • compact()方法切换到写入模式。当切入到写入模式时
      • 计算剩余字节数remaining = limit - position
      • 将剩余的字节移到缓冲区开头;
      • 将写入位置设置为左移字节的末尾;
      • 设置limit为缓冲区结尾;
    • buffer.compact()