package water.util; import java.io.*; import java.nio.ByteBuffer; import java.util.List; public final class ByteBufferInputStream extends InputStream { private final List<ByteBuffer> _buffers; private int _current; public ByteBufferInputStream(List<ByteBuffer> buffers) { this._buffers = buffers; } @Override public int read() throws IOException { return buffer().get() & 0xff; } @Override public int read(byte[] b, int off, int len) throws IOException { if( len == 0 ) return 0; ByteBuffer buffer = buffer(); int remaining = buffer.remaining(); if( len > remaining ) { buffer.get(b, off, remaining); return remaining; } buffer.get(b, off, len); return len; } private ByteBuffer buffer() throws IOException { while( _current < _buffers.size() ) { ByteBuffer buffer = _buffers.get(_current); if( buffer.hasRemaining() ) return buffer; _current++; } throw new EOFException(); } }