JAVA NIO BUFFER (五)

2017-08-19  本文已影响8人  ShootHzj

设计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的集合。

上一篇下一篇

猜你喜欢

热点阅读