NIO系列文章
1、Java NIO 基础一 NIO概念
2、Java NIO 基础二 缓冲区
3、Java NIO 基础三 通道
4、Java NIO 基础四 选择器
概念
缓冲区(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);
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。