Class RandomAccessReadBuffer

  • All Implemented Interfaces:
    java.io.Closeable, java.lang.AutoCloseable, RandomAccessRead
    Direct Known Subclasses:
    RandomAccessReadWriteBuffer

    public class RandomAccessReadBuffer
    extends java.lang.Object
    implements RandomAccessRead
    An implementation of the RandomAccessRead interface to store data in memory. The data will be stored in chunks organized in an ArrayList.
    • Field Detail

      • chunkSize

        protected int chunkSize
      • bufferList

        private final java.util.List<java.nio.ByteBuffer> bufferList
      • currentBuffer

        protected java.nio.ByteBuffer currentBuffer
      • pointer

        protected long pointer
      • currentBufferPointer

        protected int currentBufferPointer
      • size

        protected long size
      • bufferListIndex

        private int bufferListIndex
      • bufferListMaxIndex

        private int bufferListMaxIndex
      • rarbCopies

        private final java.util.concurrent.ConcurrentMap<java.lang.Long,​RandomAccessReadBuffer> rarbCopies
    • Constructor Detail

      • RandomAccessReadBuffer

        protected RandomAccessReadBuffer()
        Default constructor.
      • RandomAccessReadBuffer

        protected RandomAccessReadBuffer​(int definedChunkSize)
        Default constructor.
      • RandomAccessReadBuffer

        public RandomAccessReadBuffer​(byte[] input)
        Create a random access buffer using the given byte array.
        Parameters:
        input - the byte array to be read
      • RandomAccessReadBuffer

        public RandomAccessReadBuffer​(java.nio.ByteBuffer input)
        Create a random access buffer using the given ByteBuffer.
        Parameters:
        input - the ByteBuffer to be read
      • RandomAccessReadBuffer

        public RandomAccessReadBuffer​(java.io.InputStream input)
                               throws java.io.IOException
        Create a random access read buffer of the given input stream by copying the data to the memory.
        Parameters:
        input - the input stream to be read
        Throws:
        java.io.IOException - if something went wrong while copying the data
    • Method Detail

      • close

        public void close()
                   throws java.io.IOException
        Specified by:
        close in interface java.lang.AutoCloseable
        Specified by:
        close in interface java.io.Closeable
        Throws:
        java.io.IOException
      • seek

        public void seek​(long position)
                  throws java.io.IOException
        Seek to a position in the data.
        Specified by:
        seek in interface RandomAccessRead
        Parameters:
        position - The position to seek to.
        Throws:
        java.io.IOException - If there is an error while seeking.
      • getPosition

        public long getPosition()
                         throws java.io.IOException
        Returns offset of next byte to be returned by a read method.
        Specified by:
        getPosition in interface RandomAccessRead
        Returns:
        offset of next byte which will be returned with next RandomAccessRead.read() (if no more bytes are left it returns a value >= length of source)
        Throws:
        java.io.IOException - If there was an error while getting the current position
      • read

        public int read()
                 throws java.io.IOException
        Read a single byte of data.
        Specified by:
        read in interface RandomAccessRead
        Returns:
        The byte of data that is being read.
        Throws:
        java.io.IOException - If there is an error while reading the data.
      • read

        public int read​(byte[] b,
                        int offset,
                        int length)
                 throws java.io.IOException
        Read a buffer of data.
        Specified by:
        read in interface RandomAccessRead
        Parameters:
        b - The buffer to write the data to.
        offset - Offset into the buffer to start writing.
        length - The amount of data to attempt to read.
        Returns:
        The number of bytes that were actually read.
        Throws:
        java.io.IOException - If there was an error while reading the data.
      • readRemainingBytes

        private int readRemainingBytes​(byte[] b,
                                       int offset,
                                       int length)
      • length

        public long length()
                    throws java.io.IOException
        The total number of bytes that are available.
        Specified by:
        length in interface RandomAccessRead
        Returns:
        The number of bytes available.
        Throws:
        java.io.IOException - If there is an IO error while determining the length of the data stream.
      • expandBuffer

        protected void expandBuffer()
                             throws java.io.IOException
        create a new buffer chunk and adjust all pointers and indices.
        Throws:
        java.io.IOException
      • nextBuffer

        private void nextBuffer()
                         throws java.io.IOException
        switch to the next buffer chunk and reset the buffer pointer.
        Throws:
        java.io.IOException
      • checkClosed

        protected void checkClosed()
                            throws java.io.IOException
        Ensure that the RandomAccessBuffer is not closed
        Throws:
        java.io.IOException - If RandomAccessBuffer already closed
      • isClosed

        public boolean isClosed()
        Returns true if this source has been closed.
        Specified by:
        isClosed in interface RandomAccessRead
        Returns:
        true if the source has been closed
      • isEOF

        public boolean isEOF()
                      throws java.io.IOException
        A simple test to see if we are at the end of the data.
        Specified by:
        isEOF in interface RandomAccessRead
        Returns:
        true if we are at the end of the data.
        Throws:
        java.io.IOException - If there is an error reading the next byte.
      • createView

        public RandomAccessReadView createView​(long startPosition,
                                               long streamLength)
                                        throws java.io.IOException
        Description copied from interface: RandomAccessRead
        Creates a random access read view starting at the given position with the given length.
        Specified by:
        createView in interface RandomAccessRead
        Parameters:
        startPosition - start position within the underlying random access read
        streamLength - stream length
        Returns:
        the random access read view
        Throws:
        java.io.IOException - if something went wrong when creating the view for the RandomAccessRead
      • createBufferFromStream

        public static RandomAccessReadBuffer createBufferFromStream​(java.io.InputStream inputStream)
                                                             throws java.io.IOException
        Create e new RandomAccessReadBuffer using the given InputStream. The data is copied to the memory and the InputStream is closed.
        Parameters:
        inputStream - the InputStream holding the data to be copied
        Returns:
        the RandomAccessReadBuffer holding the data of the InputStream
        Throws:
        java.io.IOException - if something went wrong while copying the data
      • resetBuffers

        protected void resetBuffers()
        Reset to position 0 and remove all buffers but the first one.