Java NIO之Buffer详细理解

Buffer简介

Buffer:是一个指定特定数据类型的容器,主要用于和Channel进行数据交互。在多线程操作下 Buffer 是不安全的。

 

在Java NIO中使用的核心缓冲区如下(覆盖了通过I/O发送的基本数据类型:byte, char、short, int, long, float, double, long):

ByteBuffer

CharBuffer

ShortBuffer

IntBuffer

FloatBuffer

DoubleBuffer

LongBuffer

 

Buffer的基本属性

capacity(容量) :缓冲区能够容纳的数据元素的最大数量。

limit(界限):缓冲区中第一个不能读或写的元素位置

position(位置):下一个读或写的元素的索引。位置会随着get()和put()函数更新

mark(标记):标记一个备忘的位置

以上四个属性的关系:

mark <= position <= limit <= capacity

 

Buffer使用

接下来以最常用的ByteBuffer为例进行介绍

1.创建Buffer对象

  public static ByteBuffer allocate(int capacity)  //静态方法,通过内存分配创建Buffer对象

  public static ByteBuffer wrap(byte[] array)   //静态方法,将[]byte包装成ByteBuffer对象

  public static ByteBuffer wrap(byte[] array,int offset, int length) //基本同上,但指定了初始位置和长度

  public static ByteBuffer allocateDirect(int capacity) //通过分配直接缓冲区创建Buffer对象

 

  非直接缓冲区:通过allocate()分配缓冲区,将缓冲区建立在JVM的内存中

  直接缓冲区:通过allocateDirect()分配直接缓冲区,将缓冲区建立在物理内存中,可以提高效率。

内核地址空间和用户地址空间之间形成了一个物理内存映射文件,减少了内核到用户空间的copy过程

  public abstract boolean isDirect()  //可以通过该方法判断是否是直接缓冲区

  

  

2.读写常用的方法

在Buffer中有两种模式,一种是写模式,一种是读模式。

  put()相关函数:向ByteBuffer中添加元素(byte,[]byte,ByteBuffer等)

  flip()函数:将Buffer从写模式切换到读模式。调用flip()方法会将position设回0,并将limit设置成之前position的值。

  get():从Buffer中读取元素

  hasRemaining():判断Buffer中是否还有元素可读

  clear():清空元素

  compact():压缩元素(扩展空间)

 

利用Buffer读写数据,通常遵循四个步骤:

调用put()把数据写入buffer;

调用flip()从写模式切换成读模式;

调用get()从Buffer中读取数据;

调用buffer.clear()或者buffer.compact() 清除元素

 

Buffer源码

   构造器

    //构造函数,根据指定的参数来初始化Buffer特定的属性

    //此构造函数是包私有的


                
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值