Wrapping a ByteBuffer with an InputStream

后端 未结 6 1470
青春惊慌失措
青春惊慌失措 2020-12-01 04:46

I have a method that takes an InputStream and reads data from it. I would like to use this method with a ByteBuffer also. Is there a way to wrap a ByteBuffer so it can be ac

6条回答
  •  孤街浪徒
    2020-12-01 05:42

    There seem to be some bugs with the implementation referred to by Thilo, and also copy and pasted on other sites verbatim:

    1. ByteBufferBackedInputStream.read() returns a sign extended int representation of the byte it reads, which is wrong (value should be in range [-1..255])
    2. 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);
        }
    
    }
    

提交回复
热议问题