本文以CharBuffer为例,运行下代码结合注释看,有一个要点是无论什么操作,capacity不会变。
1.Buffer基本属性
public void testProperties(){
CharBuffer buffer = CharBuffer.allocate(10);
//buffer初始状态
showBuffer(buffer);
//存入三个字符后
buffer.put("abc");
showBuffer(buffer);
//flip,[position,limit]变成[0,position]
buffer.flip();
showBuffer(buffer);
//读取2个字符后
char c1 = buffer.get();
char c2 = buffer.get();
showBuffer(buffer);
//clear,恢复成[0,capacity]
buffer.clear();
showBuffer(buffer);
}
static void showBuffer(CharBuffer buffer){
StringBuilder sb = new StringBuilder();
for (int i = 0; i < buffer.limit(); i++) {
char c = buffer.get(i);
if(c == 0){
c = '.';
}
sb.append(c);
}
System.out.printf("position=%d, limit=%d, capacity=%d, content=%s\n",
buffer.position(),buffer.limit(),buffer.capacity(),sb.toString());
}
2.读取
public void testGet(){
CharBuffer buffer = CharBuffer.allocate(10);
buffer.put("abc");
BufferAttr.showBuffer(buffer);
buffer.flip();
char[] chars = new char[buffer.remaining()];
buffer.get(chars);
System.out.println(chars);
}
3.mark标记和reset重置到标记处
public void testMark(){
CharBuffer buffer = CharBuffer.allocate(10);
showBuffer(buffer);
//mark设置为3
buffer.position(3).mark().position(5);
showBuffer(buffer);
//reset,position=mark
buffer.reset();
showBuffer(buffer);
}
4.compact压缩到[position,limit]
public void testCompact(){
CharBuffer buffer = CharBuffer.allocate(10);
buffer.put("abcde");
buffer.flip();
//先读取两个字符
buffer.get();
buffer.get();
showBuffer(buffer);
//压缩
buffer.compact();
//继续写入
buffer.put("fghi");
buffer.flip();
showBuffer(buffer);
//从头读取后续的字符
char[] chars = new char[buffer.remaining()];
buffer.get(chars);
System.out.println(chars);
}
5.duplicate复制
//duplicate方法指向同一个内部数组,但分别管理各自的属性
public void testDuplicate(){
CharBuffer buffer = CharBuffer.allocate(10);
buffer.put("abcde");
CharBuffer buffer1 = buffer.duplicate();
buffer1.clear();
buffer1.put("alex");
showBuffer(buffer);
showBuffer(buffer1);
}
6.slice切片
//slice方法会把buffer切出去一部分形成新的切片,两个buffer共用切片,但分别管理各自的属性
public void testSlice(){
CharBuffer buffer = CharBuffer.allocate(20);
buffer.put("abcdefghij");
buffer.position(5);
CharBuffer slice = buffer.slice();
showBuffer(buffer);
showBuffer(slice);
slice.position(5);
slice.put("kl");
showBuffer(buffer);
showBuffer(slice);
}
参考文章: