Class NonSeekableRandomAccessReadInputStream

  • All Implemented Interfaces:
    java.io.Closeable, java.lang.AutoCloseable, RandomAccessRead

    public class NonSeekableRandomAccessReadInputStream
    extends java.lang.Object
    implements RandomAccessRead
    An implementation of the RandomAccessRead interface using an InputStream as source. It is optimized for a minimal memory footprint by using a small buffer to read from the input stream instead of copying the whole input stream to memory. This reduces the random access read abilities, so that peek/rewind operations are limited to the data within the buffer. This class is meant to be used by consumers which process the data more or less in a serial manner and therefore don't need full random access.
    • Method Summary

      All Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      protected void checkClosed()
      Ensure that the RandomAccessBuffer is not closed
      void close()
      RandomAccessReadView createView​(long startPosition, long streamLength)
      Creates a random access read view starting at the given position with the given length.
      private boolean fetch()  
      long getPosition()
      Returns offset of next byte to be returned by a read method.
      boolean isClosed()
      Returns true if this source has been closed.
      boolean isEOF()
      A simple test to see if we are at the end of the data.
      long length()
      The total number of bytes that are available.
      int read()
      Read a single byte of data.
      int read​(byte[] b, int offset, int length)
      Read a buffer of data.
      void rewind​(int bytes)
      Seek backwards the given number of bytes.
      void seek​(long position)
      Seek to a position in the data.
      void skip​(int length)
      Skips a given number of bytes.
      private void switchBuffers​(int firstBuffer, int secondBuffer)  
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Field Detail

      • LOG

        private static final org.apache.commons.logging.Log LOG
      • position

        protected long position
      • currentBufferPointer

        protected int currentBufferPointer
      • size

        protected long size
      • is

        private final java.io.InputStream is
      • buffers

        private final byte[][] buffers
      • bufferBytes

        private final int[] bufferBytes
      • isClosed

        private boolean isClosed
      • isEOF

        private boolean isEOF
    • Constructor Detail

      • NonSeekableRandomAccessReadInputStream

        public NonSeekableRandomAccessReadInputStream​(java.io.InputStream inputStream)
        Default constructor.
    • 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.
      • skip

        public void skip​(int length)
                  throws java.io.IOException
        Description copied from interface: RandomAccessRead
        Skips a given number of bytes.
        Specified by:
        skip in interface RandomAccessRead
        Parameters:
        length - the number of bytes to be skipped
        Throws:
        java.io.IOException - if an I/O error occurs while reading data
      • 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.
      • switchBuffers

        private void switchBuffers​(int firstBuffer,
                                   int secondBuffer)
      • fetch

        private boolean fetch()
                       throws java.io.IOException
        Throws:
        java.io.IOException
      • 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.
      • rewind

        public void rewind​(int bytes)
                    throws java.io.IOException
        Description copied from interface: RandomAccessRead
        Seek backwards the given number of bytes.
        Specified by:
        rewind in interface RandomAccessRead
        Parameters:
        bytes - the number of bytes to be seeked backwards
        Throws:
        java.io.IOException - If there is an error while seeking
      • 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