Buffer抽象类
Buffer是java.nio包中的一个抽象类,Buffer中存储的数据为一种特定的基本数据类型,除了boolean基本类型外,每个基本类型都对应一个子类,其特点为线性、有限序列,Buffer有几个比较重要的属性,分别为capacity、limit、position、mark。
大小关系: mark <= position <= limit <= capacity
成员变量
capacity:一个buffer的capacity表示其包含元素的数目,一旦buffer创建完成,其capacity将不会再变化,是固定的。
limit:这个属性相当于规定了一个界限范围,超过这个界限的元素将不能被读或者写,limit是不会大于capacity的。
position:position属相表示下一个可读或者写的元素,这个属性不会大于limit属性的值,初始值为0。
mark:表示当调用reset方法时,position被重置的位置。但是mark的值可能是没有定义的,但是如果定义mark,那么肯定不能比position大,否则会产生异常。如果mark被定义之后,调整position和limit的值小于或者等于mark,那么mark将会失效。并且在mark未定义时,调用reset方法将会抛出异常。
操作方法
Buffer类的每一个子类都有两种类型的get和put方法,当向buffer中读或者写一个或者多个数据后,buffer对象的position属性将会增加对应元素个数。当get或者put超过limit后那么将会引发一场。
下面是一些操作方法,其中clear()、flip()、rewind()比较重要。
clear操作将limit设置为capacity,position设置为0,以便可以channel读或者进行put操作。
flip操作将limit设置为当前的position,position设置为0,这样之前读取过的位置就可以让channel写和或者重新get之前的数据。
rewind操作知识将position变为0,可以重新读取数据。
任何Buffer都是可读的,但是不一定可写,关键是要根据isReadonly方法进行判断。
另外Buffer是线程不安全的,当多个线程同时访问buffer时,要使用同步。
Buffer除了一个函数要返回值之外,其他都返回buffer本身,可以链式调用。
public final int capacity();
public final int position();
public final Buffer position(int newPosition);
public final int limit();
public final Buffer limit(int newLimit);
public final Buffer mark();
public final Buffer reset();
public final Buffer clear();
public final Buffer flip();
public final Buffer rewind();
public final int remaining();
public final boolean hasRemaining();
public abstract boolean isReadOnly();
public abstract boolean hasArray();
public abstract Object array();
public abstract int arrayOffset();
public abstract boolean isDirect();
final int nextGetIndex();
final int nextGetIndex(int nb);
final int nextPutIndex();
final int nextPutIndex(int nb);
final int checkIndex(int i);
final int checkIndex(int i, int nb);
final int markValue();
final void truncate();
final void discardMark();
static void checkBounds(int off, int len, int size);
public int getElementSizeShift();