使用Charset和buffer时需要注意的一个小问题_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 使用Charset和buffer时需要注意的一个小问题

使用Charset和buffer时需要注意的一个小问题

 2013/11/6 12:38:55  小骏向前冲  程序员俱乐部  我要评论(0)
  • 摘要:我们经常使用Charset指定字符集用来在CharBuffer和ByteBuffer之间进行转换,但在这个过程有个小问题是需要注意的。buffer有三个指针变量:position,limit,capacity,position指向当前位置,limit之后的位置都是不可读写的,capacity代表这个buffer的容量,它们间的关系是:0<=postion<=limit<=capacitybuffer提供了多个方法来改变这几个指针变量,这里介绍最常用的postion()
  • 标签:使用 一个 问题
我们经常使用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后并无内容。
发表评论
用户名: 匿名