基本介绍:
本质——可以读写数据的内存块【一个容器对象(含数组)】;
一组方法——可以轻松使用内存块;
一些机制——跟踪或记录缓冲区的状态变化情况。
Buffer类及其子类:NIO中Buffer是一个顶级父类,抽象类
常用的Buffer子类:1)ByteBuffer——存储字节数据到缓冲区
- ShortBuffer——存储字符串数据到缓冲区
- CharBuffer——存储字符数据到缓冲区
- IntBuffer——存储整型数据到缓冲区
- LongBuffer——存储长整型数据到缓冲区
- DoubleBuffer——存储小数数据到缓冲区
- FloatBuffer——存储浮点数据到缓冲区
Buffer类定义了所有的缓冲区具有的四个基本属性来提供关于其包含数据元素的信息:
属性 | 描述 |
Capacity | 容量(可以容纳的最大数据量);在缓冲区被创建时设定且不可再更改 |
Limit | 表示缓冲区当前的终点,不能对缓冲区超过极限的位置进行读写操作,极限可修改 |
Position | 位置,下一个要被读/写的元素索引,每次读写缓冲区数据时都会改变该值,为下次读写做准备 |
Mark | 标记 |
Buffer中写数据:1)首先创建buffer缓冲区,capacity=5,limit=5,position=0,mark=-1。此时buffer中0~4位置的值默认为0。
2)循环向buffer中写入数据,每写入一个数据,position+1。
3)写入数据完成时,position移动到buffer末尾处,position=5。
Buffer中读数据:1)调用flip()方法进行读写状态切换,写入数据结束后,position位于buffer末端,故将position的值赋给limit,保证读数据时不会越界。
2)将position置为0,即从头开始读取。
Buffer常用方法:
1、public final int capacity() { return capacity;} //返回此缓冲区的容量
2、public final int position() { return position; }//返回此缓冲区的位置
3、public final Buffer position(int newPosition) { //设置缓冲区开始读取的位置
if ((newPosition > limit) || (newPosition < 0))
throw new IllegalArgumentException();
position = newPosition;
if (mark > position) mark = -1;
return this;
}
4、public final int limit() { return limit; }//返回此缓冲区的界限
5、public final Buffer limit(int newLimit) {
//设置此缓冲区的界限
if ((newLimit > capacity) || (newLimit < 0))
throw new IllegalArgumentException();
limit = newLimit;
if (position > limit) position = limit;
if (mark > limit) mark = -1;
return this;
}
6、public final Buffer clear() {
//清除此缓冲区,即将各个标记恢复到初始状态,但数据并没有真正擦除
position = 0;
limit = capacity;
mark = -1;
return this;
}
7、public final Buffer flip() {
//反转此缓冲区
limit = position;
position = 0;
mark = -1;
return this;
}
8、public final boolean hasRemaining() {return position < limit; }
//告知当前位置和界限之间是否有元素
9、public abstract boolean isReadOnly();//判断缓冲区是否只读
/************JDK1.4【上】/JDK1.6【下】*******************/
10、public abstract boolean hasArray();//告知此缓冲区是否可以访问底层实现数组
11、public abstract Object array();//返回此缓冲区的底层实现数组
ByteBuffer(二进制数据缓冲区)【最常用】
public abstract class ByteBuffer{
//缓冲区创建相关API
public static ByteBuffer allocateDirect(int capacity)//创建直接缓冲区
public static ByteBuffer allocate(int capacity)//设置缓冲区的初始容量
public static ByteBuffer wrap(byte[] array)//把一个数组放到缓冲区中使用
//构造初始化位置offset和上界length的缓冲区
public static ByteBuffer wrap(byte[] array, int offset, int length)
//缓冲区存取相关API
public abstract byte get();//从当前位置position上get,get之后,position自动+1
public abstract byte get(int index);//从绝对位置上get
public abstract ByteBuffer put(byte b);//从当前位置put,put之后,position自动+1
public abstract ByteBuffer put(int index, byte b);//从绝对位置上put
}