All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.bigdata.io.ByteBufferInputStream Maven / Gradle / Ivy

/**

Copyright (C) SYSTAP, LLC DBA Blazegraph 2006-2016.  All rights reserved.

Contact:
     SYSTAP, LLC DBA Blazegraph
     2501 Calvert ST NW #106
     Washington, DC 20008
     [email protected]

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/
package com.bigdata.io;

import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;

/**
 * Reads bytes from a {@link ByteBuffer}. This class IS NOT thread-safe.
 * Caller's MUST {@link ByteBuffer#duplicate()} the {@link ByteBuffer} before
 * creating an instance of this class if they wish to avoid side-effects on the
 * position and limit of the original {@link ByteBuffer}.
 * 
 * @author Bryan Thompson
 * @version $Id$
 * 
 * @todo document that this reads the remaining() bytes and has a side effect on
 *       the position. if that is not the desired behavior then either modify
 *       this class or invoke {@link ByteBuffer#asReadOnlyBuffer()} and pass the
 *       result into the constructor instead.
 * 
 * @todo dsiutils now defines its own implementation of this but does not define
 *       a ByteBufferOutputStream class. if it did, then we might just use its
 *       implementations instead.
 */
public class ByteBufferInputStream extends InputStream {

    private final ByteBuffer buf;

    public ByteBufferInputStream(final ByteBuffer buf) {

        if (buf == null)
            throw new IllegalArgumentException();

        this.buf = buf;

    }

    /**
     * Read the next byte from the buffer.
     * 
     * @return The byte as a value in [0:255].
     */
    synchronized
    public int read() throws IOException {

        if (buf.remaining() == 0) {

            return -1;

        }

        // A byte whose value is in [-128:127].
        final byte b = buf.get();

        return (0xff & b);
        //            return ((int) b) + 128;
        //            int v = ((int)b) + 128;
        //            assert v>=0 && v<=255;
        //            return v;
        //            return b;

    }

    synchronized
    public int read(final byte[] a, final int off, final int len)
            throws IOException {

        if (len == 0)
            return 0;
        
        final int remaining = buf.remaining();
        
        if (remaining == 0)
            return -1;
        
        final int readLength = Math.min(remaining, len);
        
        // current limit.
        final int climit = buf.limit();

        // new limit.
        buf.limit(buf.position() + readLength);
        
        // bulk copy.
        buf.get(a, off, readLength);

        // restore the limit (position was updated as a side effect).
        buf.limit(climit);

        // #of bytes transferred.
        return readLength;

    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy