基本介绍
缓冲区(buffer):buffer本质上是一个可以读写的内存块,可以理解成是一个容器,该容器提供了一系列的方法,可以轻松的使用内存块。缓冲区中内置了一些机制,能够跟踪和记录缓冲区的状态变化情况。Channel提供了从文件、网络中读取数据的渠道,但是读写数据都必须经由buffer。
Buffer类及其子类
Buffer类定义了所有缓冲区都具有的四个属性来提供关于其所包含的数据信息:
/**
标记
*/
private int mark = -1;
/**
位置。下一个要被读或者写的元素的索引,每次读写数据都会改变 该值
*/
private int position = 0;
/**
表示缓冲区的当前终点,不能对超过该值的位置进行读写
*/
private int limit;
/**
容量,既可以容纳的最大数据量,在缓冲区创建时设定且不能改变
*/
private int capacity;
遵循这样的不变关系:mark <= position <= limit <= capacity
相关方法及说明:

注意事项:
当我们使用get()方法去读取缓冲区的数据时,需要调用flip()方法,表示反转缓冲区,否则会出现BufferUnderflowException异常。看下filp()方法以及get()代码:
//反转缓冲区,如果调用前时put方法,反转之后,
// position置为0,即读游标为0,且可读长度为limit
public final Buffer flip() {
limit = position;
position = 0;
mark = -1;
return this;
}
public byte get() {
return hb[ix(nextGetIndex())];
}
//每次get()读取之后,position加一
final int nextGetIndex() {
if (position >= limit)
throw new BufferUnderflowException();
return position++;
}
如果是调用get(int index),通过下标读取不会改变position的值,则不会出现BufferUnderflowException异常。
网友评论