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特定的属性
//此构造函数是包私有的

最低0.47元/天 解锁文章
1167

被折叠的 条评论
为什么被折叠?



