美文网首页
JAVA NIO BUFFER (五)

JAVA NIO BUFFER (五)

作者: ShootHzj | 来源:发表于2017-08-19 00:58 被阅读8次

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

    相关文章

      网友评论

          本文标题:JAVA NIO BUFFER (五)

          本文链接:https://www.haomeiwen.com/subject/povzrxtx.html