Java NIO缓冲区Buffer基础教程示例
作者:lane
这篇文章主要介绍了Java NIO缓冲区Buffer基础教程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
概念
缓冲区(Buffer)本质上是管理着基本元数对象的数组
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');

调用flip翻转后的缓冲区
buffer.flip();

直接缓冲区直接缓冲区是指java虚拟机堆栈外的系统存储区,通常情况通道之间的缓冲区数据传输不能直接使用非直接缓冲区,而是会创建临时直接缓冲区来复制数据后传输,这样导致性能损耗。如果是高并发情况下重复使用缓冲区,使用直接缓冲区可以提高IO性能。但是创建直接缓冲区需要绕过JVM直接操作本地系统,这样的创建和销毁动作需要更高的成本。
缓冲区的创建方式
以ByteBuffer为例
//创建一个直接缓冲区 ByteBuffer buffer = ByteBuffer.allocateDirect(1024);
//创建一个间接缓冲区 ByteBuffer buffer = ByteBuffer.allocate(1024);
//创建一个只读的备份缓冲区 byte[] bytes = "hello".getBytes(); ByteBuffer buffer = ByteBuffer.wrap(bytes);
以上就是Java NIO缓冲区Buffer基础教程示例的详细内容,更多关于Java NIO缓冲区Buffer的资料请关注脚本之家其它相关文章!
