Поскольку этот вопрос по-прежнему является одним из первых обращений к копированию ByteBuffer
, я предложу свое решение.Это решение не касается исходного буфера, включая любой набор меток, и возвращает глубокую копию с той же емкостью, что и оригинал.
public static ByteBuffer cloneByteBuffer(final ByteBuffer original) {
// Create clone with same capacity as original.
final ByteBuffer clone = (original.isDirect()) ?
ByteBuffer.allocateDirect(original.capacity()) :
ByteBuffer.allocate(original.capacity());
// Create a read-only copy of the original.
// This allows reading from the original without modifying it.
final ByteBuffer readOnlyCopy = original.asReadOnlyBuffer();
// Flip and read from the original.
readOnlyCopy.flip();
clone.put(readOnlyCopy);
return clone;
}
Если кто-то заботится о позиции, пределе или приказеустановить так же, как оригинал, тогда это простое дополнение к выше:
clone.position(original.position());
clone.limit(original.limit());
clone.order(original.order());
return clone;