Java NIO 基础二 缓冲区

Buffer家族
image.png

Buffer本质上是管理着基本元数对象的数组

Buffer基本属性

/** Invariants: mark <= position <= limit <= capacity */

//用来临时标记position的位置,便于还原
private int mark = -1;
//即将读取或写入的开始位置
private int position = 0;
//上界,缓冲区现有元素的数量
private int limit;
//缓存区的最大容量,初始化时设定,不能改变
private int capacity;

Buffer基本API

package java.nio;

public abstract class Buffer {
    //获取缓冲区容量
    public final int capacity()
    //获取当前位置
    public final int position()
    //设置一个新的position
    public final Buffer position(int newPosition)
    //获取上界位置
    public final int limit()
    //设置一个新的上界位置,但是不能小于0或超过capacity
    public final Buffer limit(int newLimit)
    //标记当前position
    public final Buffer mark()
    //恢复标记的position
    public final Buffer reset()
    //重新设置mark=-1 position=0 limit=capacity,读取完数据调用,数据没有被清理,写入的数据会覆盖之前的数据
    public final Buffer clear()
    //翻转缓冲区,使写入的数据进入可读状态
    public final Buffer flip()
    //重置读写位置,将position设为0,mark设为-1丢弃
    public final Buffer rewind()
    //获取当前位置好缓冲区上界Limit还有多少元素
    public final int remaining()
    //判断position是否已经达到limit上界,用于判断是否已经全部读取完毕
    public final boolean hasRemaining()
    //判断当前缓冲区是否是只读的
    public abstract boolean isReadOnly();
}

填充Hello后的缓冲区

ByteBuffer buffer=ByteBuffer.allocate(10);
buffer.put((byte)'H').put((byte)'e').put((byte)'l').put((byte)'l').put((byte)'o');

image.png

调用flip翻转后的缓冲区

buffer.flip();

image.png

直接缓冲区
直接缓冲区是指java虚拟机堆栈外的系统存储区,通常情况通道之间的缓冲区数据传输不能直接使用非直接缓冲区,而是会创建临时直接缓冲区来复制数据后传输,这样导致性能损耗。如果是高并发情况下重复使用缓冲区,使用直接缓冲区可以提高IO性能。但是创建直接缓冲区需要绕过JVM直接操作本地系统,这样的创建和销毁动作需要更高的成本。

缓冲区的创建方式,以ByteBuffer为例

//创建一个直接缓冲区
ByteBuffer buffer = ByteBuffer.allocateDirect(1024);
//创建一个间接缓冲区
ByteBuffer buffer = ByteBuffer.allocate(1024);
//创建一个只读的备份缓冲区
byte[] bytes = "hello".getBytes();
ByteBuffer buffer = ByteBuffer.wrap(bytes);

你可能感兴趣的