public int write(final ByteBuffer src) throws IOException { if (src == null) { return 0; } assertNotCompleted(); int chunk = src.remaining(); if (chunk == 0) { return 0; } this.lineBuffer.clear(); this.lineBuffer.append(Integer.toHexString(chunk)); this.buffer.writeLine(this.lineBuffer); int remaining = this.buffer.length(); if (chunk + 4 <= remaining) { //CRLF of the empty line this.buffer.write(src); this.lineBuffer.clear(); this.buffer.writeLine(this.lineBuffer); } else { ByteBuffer subsrc; int toput = 0; int sliceSize = chunk; while (remaining <= sliceSize) { toput = Math.min(remaining, sliceSize); subsrc = (ByteBuffer) src.slice().limit(toput); this.buffer.write(subsrc); int flushed = this.buffer.flush(this.channel); sliceSize -= toput; remaining = this.buffer.length(); } subsrc = (ByteBuffer) src.slice().limit(chunk); this.buffer.write(subsrc); this.lineBuffer.clear(); this.buffer.writeLine(this.lineBuffer); } return chunk; }