There seem to be some bugs with the implementation referred to by Thilo, and also copy and pasted on other sites verbatim:
ByteBufferBackedInputStream.read()
returns a sign extended int representation of the byte it reads, which is wrong (value should be in range [-1..255])
ByteBufferBackedInputStream.read(byte[], int, int)
does not return -1 when there are no bytes remaining in the buffer, as per the API spec
ByteBufferBackedOutputStream seems relatively sound.
I present a 'fixed' version below. If I find more bugs (or someone points them out) I'll update it here.
Updated: removed synchronized
keywords from read/write methods
InputStream
public class ByteBufferBackedInputStream extends InputStream {
ByteBuffer buf;
public ByteBufferBackedInputStream(ByteBuffer buf) {
this.buf = buf;
}
public int read() throws IOException {
if (!buf.hasRemaining()) {
return -1;
}
return buf.get() & 0xFF;
}
public int read(byte[] bytes, int off, int len)
throws IOException {
if (!buf.hasRemaining()) {
return -1;
}
len = Math.min(len, buf.remaining());
buf.get(bytes, off, len);
return len;
}
}
OutputStream
public class ByteBufferBackedOutputStream extends OutputStream {
ByteBuffer buf;
public ByteBufferBackedOutputStream(ByteBuffer buf) {
this.buf = buf;
}
public void write(int b) throws IOException {
buf.put((byte) b);
}
public void write(byte[] bytes, int off, int len)
throws IOException {
buf.put(bytes, off, len);
}
}
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…