@Override public void getBytes(long l, ByteBuffer dest) { final int length = dest.remaining(); checkBounds(l, length); if (dest.isDirect()) { NativeMemoryUtils.copyToDirectBuffer(address+l, dest, dest.position(), length); dest.position(dest.position()+length); } else if (dest.hasArray()) { final byte[] array = dest.array(); final int offset = dest.arrayOffset(); getBytes(l, array, offset+dest.position(), length); dest.position(dest.position()+length); } else { final byte[] copyBuffer = new byte[Math.min(length, 4096)]; long sourceAddr = l; while (dest.remaining() > 0) { final int copySize = Math.min(copyBuffer.length, dest.remaining()); getBytes(sourceAddr, copyBuffer, 0, copySize); dest.put(copyBuffer, 0, copySize); sourceAddr+=copySize; } } }