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的资料请关注脚本之家其它相关文章!