Creating a Stream on a ByteBuffer
This example implements methods for creating an input or
output stream on a ByteBuffer.
// Obtain a ByteBuffer; see Creating a ByteBuffer. ByteBuffer buf = ByteBuffer.allocate(10); // Create an output stream on the ByteBuffer OutputStream os = newOutputStream(buf); // Create an input stream on the ByteBuffer InputStream is = newInputStream(buf); // Returns an output stream for a ByteBuffer. // The write() methods use the relative ByteBuffer put() methods. public static OutputStream newOutputStream(final ByteBuffer buf) { return new OutputStream() { public synchronized void write(int b) throws IOException { buf.put((byte)b); } public synchronized void write(byte[] bytes, int off, int len) throws IOException { buf.put(bytes, off, len); } }; } // Returns an input stream for a ByteBuffer. // The read() methods use the relative ByteBuffer get() methods. public static InputStream newInputStream(final ByteBuffer buf) { return new InputStream() { public synchronized int read() throws IOException { if (!buf.hasRemaining()) { return -1; } return buf.get(); } public synchronized int read(byte[] bytes, int off, int len) throws IOException { // Read only what's left len = Math.min(len, buf.remaining()); buf.get(bytes, off, len); return len; } }; }
Thanks!
There is a bug in this code. In InputStream.read, need to return (int)(buf.get() & 0xFF);
Java converts a byte to a signed int by default, so any values over 127 will be wrong.
there is an error in the read method, according to the javadocs it must return -1 so it should be:
public synchronized int read(byte[] bytes, int off, int len) throws IOException {
if (!buf.hasRemaining()) {
return -1;
}
// Read only what's left
len = Math.min(len, buf.remaining());
buf.get(bytes, off, len);
return len;
}
:) this popped up when we tried to load jpg images! png worked fine... but jpg only worked after the fix.
Cheers
Please fix the example as proposed in the comment from 15 Apr 2010. The InputStream.read method returns values from 0 to 255 and -1 for end of stream. ByteBuffer.get() retuns byte (-128 to 127)