Class RandomAccessReadBufferedFile

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

    public class RandomAccessReadBufferedFile
    extends java.lang.Object
    implements RandomAccessRead
    Provides random access to portions of a file combined with buffered reading of content. Start of next bytes to read can be set via seek method. File is accessed via FileChannel and is read in ByteBuffer chunks which are cached.
    • Field Detail

      • lastRemovedCachePage

        private java.nio.ByteBuffer lastRemovedCachePage
      • pageCache

        private final java.util.Map<java.lang.Long,​java.nio.ByteBuffer> pageCache
        Create a LRU page cache.
      • curPageOffset

        private long curPageOffset
      • curPage

        private java.nio.ByteBuffer curPage
      • offsetWithinPage

        private int offsetWithinPage
      • fileChannel

        private final java.nio.channels.FileChannel fileChannel
      • path

        private final java.nio.file.Path path
      • fileLength

        private final long fileLength
      • fileOffset

        private long fileOffset
      • isClosed

        private boolean isClosed
    • Constructor Detail

      • RandomAccessReadBufferedFile

        public RandomAccessReadBufferedFile​(java.lang.String filename)
                                     throws java.io.IOException
        Create a random access buffered file instance for the file with the given name.
        Parameters:
        filename - the filename of the file to be read.
        Throws:
        java.io.IOException - if something went wrong while accessing the given file.
      • RandomAccessReadBufferedFile

        public RandomAccessReadBufferedFile​(java.io.File file)
                                     throws java.io.IOException
        Create a random access buffered file instance for the given file.
        Parameters:
        file - the file to be read.
        Throws:
        java.io.IOException - if something went wrong while accessing the given file.
      • RandomAccessReadBufferedFile

        public RandomAccessReadBufferedFile​(java.nio.file.Path path)
                                     throws java.io.IOException
        Create a random access buffered file instance using the given path.
        Parameters:
        path - path of the file to be read.
        Throws:
        java.io.IOException - if something went wrong while accessing the given file.
    • Method Detail

      • getPosition

        public long getPosition()
                         throws java.io.IOException
        Description copied from interface: RandomAccessRead
        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
      • seek

        public void seek​(long position)
                  throws java.io.IOException
        Seeks to new position. If new position is outside of current page the new page is either taken from cache or read from file and added to cache.
        Specified by:
        seek in interface RandomAccessRead
        Parameters:
        position - the position to seek to.
        Throws:
        java.io.IOException - if something went wrong.
      • readPage

        private java.nio.ByteBuffer readPage()
                                      throws java.io.IOException
        Reads a page with data from current file position. If we have a previously removed page from cache the buffer of this page is reused. Otherwise a new byte buffer is created.
        Throws:
        java.io.IOException
      • read

        public int read()
                 throws java.io.IOException
        Description copied from interface: RandomAccessRead
        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 off,
                        int len)
                 throws java.io.IOException
        Description copied from interface: RandomAccessRead
        Read a buffer of data.
        Specified by:
        read in interface RandomAccessRead
        Parameters:
        b - The buffer to write the data to.
        off - Offset into the buffer to start writing.
        len - 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.
      • length

        public long length()
                    throws java.io.IOException
        Description copied from interface: RandomAccessRead
        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.
      • 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
      • isClosed

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

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

        public boolean isEOF()
                      throws java.io.IOException
        Description copied from interface: RandomAccessRead
        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