Here you can find the source of concat(byte[] pre, ByteBuffer bbuf)
public static ByteBuffer concat(byte[] pre, ByteBuffer bbuf)
//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 } }