Java ByteBuffer Concatenate concat(byte[] pre, ByteBuffer bbuf)

Here you can find the source of concat(byte[] pre, ByteBuffer bbuf)

Description

concat

License

Open Source License

Declaration

public static ByteBuffer concat(byte[] pre, ByteBuffer bbuf) 

Method Source Code

//package com.java2s;
/*/*www  .  j a va  2s  . c o  m*/
 * ByteBufferUtil.java - An utility for ByteBuffer.
 * 
 * Copyright (c) 2009-2015 PIAX development team
 * Copyright (c) 2006-2008 Osaka University
 * Copyright (c) 2004-2005 BBR Inc, Osaka University
 * 
 * Permission is hereby granted, free of charge, to any person obtaining 
 * a copy of this software and associated documentation files (the 
 * "Software"), to deal in the Software without restriction, including 
 * without limitation the rights to use, copy, modify, merge, publish, 
 * distribute, sublicense, and/or sell copies of the Software, and to 
 * permit persons to whom the Software is furnished to do so, subject to 
 * the following conditions:
 * 
 * The above copyright notice and this permission notice shall be 
 * included in all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 
 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 
 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 
 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 
 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 * 
 * $Id: ByteBufferUtil.java 1176 2015-05-23 05:56:40Z teranisi $
 */

import java.nio.ByteBuffer;

public class Main {
    static final int DEFAULT_ENHANCE_SIZE = 256;

    public static ByteBuffer concat(byte[] pre, ByteBuffer bbuf) {
        ByteBuffer b = reserve(pre.length, bbuf);
        b.put(pre);
        rewind(b);
        return b;
    }

    public static ByteBuffer concat(ByteBuffer pre, ByteBuffer bbuf) {
        ByteBuffer b = reserve(pre.remaining(), bbuf);
        b.put(pre);
        rewind(pre);
        rewind(b);
        return b;
    }

    public static ByteBuffer reserve(int preLen, ByteBuffer bbuf) {
        if (preLen == 0)
            return bbuf;
        ByteBuffer bbuf2 = bbuf;
        if (preLen > bbuf.position()) {
            // enhance the ByteBuffer
            int esize = DEFAULT_ENHANCE_SIZE + preLen - bbuf.position();
            bbuf2 = enhance(esize, bbuf);
        }
        bbuf2.position(bbuf2.position() - preLen);
        bbuf2.mark();
        return bbuf2;
    }

    public static ByteBuffer put(ByteBuffer bbuf, byte[] post) {
        ByteBuffer b = bbuf;
        int postLen = post.length;
        if (postLen == 0)
            return b;
        if (postLen > bbuf.remaining()) {
            // enhance the ByteBuffer
            int esize = DEFAULT_ENHANCE_SIZE + postLen - bbuf.remaining();
            b = enhance(bbuf, esize);
        }
        b.put(post);
        return b;
    }

    public static ByteBuffer put(ByteBuffer bbuf, ByteBuffer post) {
        ByteBuffer b = bbuf;
        int postLen = post.remaining();
        if (postLen == 0)
            return b;
        if (postLen > bbuf.remaining()) {
            // enhance the ByteBuffer
            int esize = DEFAULT_ENHANCE_SIZE + postLen - bbuf.remaining();
            b = enhance(bbuf, esize);
        }
        b.put(post);
        rewind(post);
        return b;
    }

    public static void rewind(ByteBuffer b) {
        b.reset(); // position = mark
    }

    public static ByteBuffer enhance(int size, ByteBuffer bbuf) {
        ByteBuffer bbuf2 = ByteBuffer.wrap(new byte[bbuf.capacity() + size]);
        bbuf2.limit(bbuf.limit() + size);
        bbuf2.position(bbuf.position() + size);
        bbuf2.mark();
        bbuf2.put(bbuf);
        rewind(bbuf2);
        return bbuf2;
    }

    public static ByteBuffer enhance(ByteBuffer bbuf, int size) {
        byte[] b = new byte[bbuf.capacity() + size];
        System.arraycopy(bbuf.array(), 0, b, 0, bbuf.limit());
        ByteBuffer bbuf2 = ByteBuffer.wrap(b);
        bbuf2.limit(bbuf.limit() + size);
        // save current position and mark
        int pos = bbuf.position();
        bbuf.reset();
        int mark = bbuf.position();
        // restore to bbuf2
        bbuf2.position(mark);
        bbuf2.mark();
        bbuf2.position(pos);
        return bbuf2;
    }

    public static void mark(ByteBuffer b) {
        b.mark(); // mark = position
    }

    public static void reset(int offset, ByteBuffer b) {
        b.position(offset);
        b.mark(); // mark = position
    }
}

Related

  1. concat(ByteBuffer b1, ByteBuffer b2)
  2. concat(ByteBuffer outPart1, ByteBuffer outPart2)
  3. concat(ByteBuffer[] buf1, ByteBuffer[] buf2)
  4. concat(ByteBuffer[] buffers, ByteBuffer buffer)