我们经常使用Charset指定字符集用来在CharBuffer和ByteBuffer之间进行转换,但在这个过程有个小问题是需要注意的。
buffer有三个指针变量:position,limit,capacity,position指向当前位置,limit之后的位置都是不可读写的,capacity代表这个buffer的容量,它们间的关系是:
0<=postion<=limit<=capacity
buffer提供了多个方法来改变这几个指针变量,这里介绍最常用的postion(),limit(),capacity(),flip()和clear();
前面三个很明显是分别指定三个指针变量的位置了,至于flip(),它的作用相当于limit(position);
position(0);
即让limit指向当前已读/写的位置,让后面的数据都不可读写,然后让position指向开始位置;而clear()并非把数据全部清零,它的作用相当于
limit(capacity);
position(0);
clear()与flip()的唯一区别是前者让所有数据重新可读写(并不擦除之前的数据),后者指定当前位置之后的数据都不可读写,我们一般在读/写完成后flip(),需要重新读写前clear();
看下面的代码:
public
class CharsetTransform {
public static void main(String[] args) {
Charset cn = Charset.forName("GBK");
CharBuffer cbuff = CharBuffer.allocate(8);
cbuff.put("赖");
cbuff.put("一");
cbuff.put("骏");
cbuff.flip();
ByteBuffer bbuff = cn.encode(cbuff);
for (int i = 0; i < bbuff.capacity(); i++) {
System.out.print(bbuff.get() + " ");
}
bbuff.flip();
System.out.println("\n" + cn.decode(bbuff).toString());
}
}
红色代码flip()把position重新指定为0,如果不这样做,代码中的encode/decode后的字符串是空的,因为当前position后并无内容。