//基本概念
limit 对缓存区的读写操作以limit值为上限
position 当前游标位置(也就是当前操作的位置)
capacity 缓存区容量(一般和limit一样)
常用方法
//分配缓存区大小
public static ByteBuffer allocate(int capacity) {
if (capacity < 0)
throw createCapacityException(capacity);
return new HeapByteBuffer(capacity, capacity);
}
//写入内容
public ByteBuffer put(byte[] src, int offset, int length) {
checkBounds(offset, length, src.length);
if (length > remaining())
throw new BufferOverflowException();
int end = offset + length;
for (int i = offset; i < end; i++)
this.put(src[i]);
return this;
}
//读取内容
public ByteBuffer get(byte[] dst, int offset, int length) {
checkBounds(offset, length, dst.length);
if (length > remaining())
throw new BufferUnderflowException();
int end = offset + length;
for (int i = offset; i < end; i++)
dst[i] = get();
return this;
}
//作用转换为读模式,操作上限修改为当前操作的位置,然后游标置0,
//这样就可以从开头读取
public Buffer flip() {
limit = position;
position = 0;
mark = -1;
return this;
}
//重置当前读写位置,清除所有内容
public Buffer clear() {
position = 0;
limit = capacity;
mark = -1;
return this;
//重置当前游标不清除内容,一般配合flip多次读取操作
public Buffer rewind() {
position = 0;
mark = -1;
return this;
//在当前游标位置设置标记
public Buffer mark() {
mark = position;
return this;
}
//将游标的位置设置到上一次mark标记的位置
public Buffer reset() {
int m = mark;
if (m < 0)
throw new InvalidMarkException();
position = m;
return this;
}
public static void main(String[] args) {
ByteBuffer buff = ByteBuffer.allocate(1024);
// 写入数据
buff.put("hello".getBytes());
System.out.println(
"当前游标: " + buff.position() + " 当前读写上限: " + buff.limit() + " 当前容量:" + buff.capacity());
// 设置当前读写上限为当前游标也就是limit=position 这样就不会读的时候分配的1024字节全部读
buff.flip();
System.out.println(
"当前游标: " + buff.position() + " 当前读写上限: " + buff.limit() + " 当前容量:" + buff.capacity());
// 创建当前缓冲区上限的字节数组
byte[] ibuff = new byte[buff.limit()];
// 读入到数组
buff.get(ibuff);
// 转换成字符串
String s = new String(ibuff);
System.out.println(s);
// 重置缓存区
buff.clear();
}
网友评论