Buffer是一个缓冲(容器),里面可以写数据,读数据等操作,数据都是同一种类型。
重要属性有
- capacity: Buffer容量
- limit: 第一个不能读或者写的元素的下标。(position到limit之间为可操作元素)
- position:下一个读或者写位置的下标
- mark: mark的位置为reset时position设置的位置
Buffer的操作就是玩这几个下标
重要操作
clear: limit <- capacity, position <- 0
flip: limit <- position, position <- 0
rewind: position <- 0 , limit不变
线程安全性:
Buffer不是线程安全,需要人工添加同步功能。
api
//Returns the number of elements between the current position and the limit.
int remaining()
//Flips this buffer.
Buffer flip()
ByteBuffer
/*
将position至limit之间的元素顺序左移至buffer开头开始
*/
public abstract ByteBuffer compact()
CharBuffer
//创建一个CharBuffer, 里面有个char数组作为元素容器
public static CharBuffer allocate(int capacity)
//包装一个数组生成一个charbuffer
public static CharBuffer wrap(char[] array,int offset, int length)
复制
duplicate
Duplicate()函数创建了一个与原始缓冲区相似的新缓冲区。两个缓冲区共享数据元素,拥有同样的容量,但每个缓冲区拥有各自的位置,上界和标记属性。对一个缓冲区内的数据元素所做的改变会反映在另外一个缓冲区上。
slice
slice()创建一个从原始缓冲区的当前位置开始的新缓冲区,并且其容量是原始缓冲区的剩余元素数量(limit-position)。这个新缓冲区与原始缓冲区共享一段数据元素子序列
直接缓冲区(堆外)
public abstract class ByteBuffer extends Buffer implements Comparable {
public static ByteBuffer allocate (int capacity);
public static ByteBuffer allocateDirect (int capacity);
public abstract boolean isDirect( );
}