设计buffer的目标是为了有效的数据交换,在循环中依次移动数据非常地没有效率。如下列出了CharBuffer中大量移动数据的API
public abstract class CharBuffer extends Buffer implements CharSequence,Comparable {
//这只是方法的一部分
public CharBuffer get (char[] dst)
public CharBuffer get(char[] dst, int offset, int length)
public final CharBuffer put (char[] src)
public CharBuffer put(char[] src, int offset, int length)
public CharBuffer put(char[] src)
public final CharBuffer put(String src)
public CharBuffer put(String src, int start, int end)
两种方式从数组中复制数据。第一个方法,只携带一个数组作为参数。第二个携带偏移量和长度两个参数指定子数组。虽然最终这个和循环移动的结果相同,但是这种方式往往更加有效,因为通常这些方法都会优化移动数据或者调用native代码。
如果你要求的数据们无法被转移,那么会抛出BufferUnderflowException.或者你要求的参数,buffer无法全部填充,也会抛出异常。在尝试获取数据之前,你应该先判断一下容量是否充足:
char[] bigArray = new char[1000];
//获取buffer剩余输出
int length = buffer.remaining();
//如果length不够填充整个数组
buffer.get(bigArray,0,length);
processData(bigArray,length);
但是如果buffer持有的数据大于了你的数组,你可以这么做:
char[] smallArray = new char[10];
while (buffer.hasRemaining()) {
int length = Math.min(buffer.remaining(), smallArray.length);
buffer.get(smallArray, 0, length);
processData(smallArray, length);
}
buffer的put方法,如果buffer有空间存放这些数据,数据就会从现在buffer的position中开始写入,并且更新buffer的position值。如果空间不足,不会有任何数据写入,并抛出BufferOverflowException。
当然buffer的put方法也可以直接传入一个buffer作为参数,这和下面的操作等价:
dstBuffer.put(srcBuffer) 等价于 dstBuffer.put(srcBuffer.get());
如果是以String为参数的put方法,和charArray类似。尽管String并不是char的集合,但我们倾向于把String概念化为char的集合。