JAVA NIO BUFFER (五)
【摘要】 设计buffer的目标是为了有效的数据交换,在循环中依次移动数据非常地没有效率。如下列出了CharBuffer中大量移动数据的APIpublic abstract class CharBuffer extends Buffer implements CharSequence,Comparable { //这只是方法的一部分 public CharBuffer get (char[] ds...
设计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的集合。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)