Buffer类
- 容量(capacity)容纳元素的最大数量,在缓冲区创建时被设定并且不能更改
- 上界(limit)缓冲区第一个不能被读或者写的位置
- 位置(position)下一个要被读或者写的位置
- 标记(mark)备忘标记。调用mark()来设定mark=position,调用reset()设定position=mark
满足 0 <= mark <= position <= limit <= capacity
// 新创建容量为10的ByteBuffer,此时,mark=-1, position=0,limit=capacity=10
ByteBuffer byteBuffer = ByteBuffer.allocate(10);
System.out.println(byteBuffer.getClass());
// 写入数据,此时 mark=-1, position=5,limit=capacity=10
byteBuffer.put((byte)'h').put((byte)'e').put((byte)'l').put((byte)'l').put((byte)'o');
// 是否只读
byteBuffer.isReadOnly();
// 切换到读模式,需要将limit设置为position的位置,position设置成0
byteBuffer.limit(byteBuffer.position()).position(0);
// ByteBuffer对上面的操作已经封装成了 flip()操作。简单来说flip将写状态的ByteBuffer切换到读状态
byteBuffer.flip();
// 设置position=0,可以在读模式下调用rewind(),进行数据重新读取
byteBuffer.rewind();
// 缓冲区是否有剩余未读元素
byteBuffer.hasRemaining();
// 取出元素
while (byteBuffer.hasRemaining()) {
System.out.println(byteBuffer.get());
}
// 缓冲区剩余元素数量
byteBuffer.remaining();
// 清理ByteBuffer,可以被重新写入。设置position=0,limit=capacity
byteBuffer.clear();
// 缓冲区部分被读取的情况下,调用compact可以清理已读取数据,保留未读取数据,并且缓冲区变成写模式
byteBuffer.compact();
// 从数据创建buffer,所有对buffer的改动都会在array中体现
byte [] array = new byte[10];
ByteBuffer fromArrayBuffer = ByteBuffer.wrap(array);
fromArrayBuffer.array();