コード例 #1
0
 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;
 }