private boolean put(ByteArrayOutputStream id, InputStream in, int level) throws IOException { if (level > 0) { ByteArrayOutputStream id2 = new ByteArrayOutputStream(); while (true) { boolean eof = put(id2, in, level - 1); if (id2.size() > maxBlockSize / 2) { id2 = putIndirectId(id2); id2.writeTo(id); return eof; } else if (eof) { id2.writeTo(id); return true; } } } byte[] readBuffer = nextBuffer.getAndSet(null); if (readBuffer == null) { readBuffer = new byte[maxBlockSize]; } byte[] buff = read(in, readBuffer); if (buff != readBuffer) { // re-use the buffer if the result was shorter nextBuffer.set(readBuffer); } int len = buff.length; if (len == 0) { return true; } boolean eof = len < maxBlockSize; if (len < minBlockSize) { // in-place: 0, len (int), data id.write(0); DataUtils.writeVarInt(id, len); id.write(buff); } else { // block: 1, len (int), blockId (long) id.write(1); DataUtils.writeVarInt(id, len); DataUtils.writeVarLong(id, writeBlock(buff)); } return eof; }