Class RandomAccessReadBufferedFile

java.lang.Object
org.apache.pdfbox.io.RandomAccessReadBufferedFile
All Implemented Interfaces:
Closeable, AutoCloseable, RandomAccessRead

public class RandomAccessReadBufferedFile extends 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 Details

    • PAGE_SIZE_SHIFT

      private static final int PAGE_SIZE_SHIFT
      See Also:
    • PAGE_SIZE

      private static final int PAGE_SIZE
      See Also:
    • PAGE_OFFSET_MASK

      private static final long PAGE_OFFSET_MASK
      See Also:
    • MAX_CACHED_PAGES

      private static final int MAX_CACHED_PAGES
      See Also:
    • rafCopies

    • lastRemovedCachePage

      private ByteBuffer lastRemovedCachePage
    • pageCache

      private final Map<Long,ByteBuffer> pageCache
      Create a LRU page cache.
    • curPageOffset

      private long curPageOffset
    • curPage

      private ByteBuffer curPage
    • offsetWithinPage

      private int offsetWithinPage
    • fileChannel

      private final FileChannel fileChannel
    • path

      private final Path path
    • fileLength

      private final long fileLength
    • fileOffset

      private long fileOffset
    • isClosed

      private boolean isClosed
  • Constructor Details

    • RandomAccessReadBufferedFile

      public RandomAccessReadBufferedFile(String filename) throws 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:
      IOException - if something went wrong while accessing the given file.
    • RandomAccessReadBufferedFile

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

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

    • getPosition

      public long getPosition() throws 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:
      IOException - If there was an error while getting the current position
    • seek

      public void seek(long position) throws 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:
      IOException - if something went wrong.
    • readPage

      private ByteBuffer readPage() throws 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:
      IOException
    • read

      public int read() throws 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:
      IOException - If there is an error while reading the data.
    • read

      public int read(byte[] b, int off, int len) throws 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:
      IOException - If there was an error while reading the data.
    • length

      public long length() throws 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:
      IOException - If there is an IO error while determining the length of the data stream.
    • close

      public void close() throws IOException
      Specified by:
      close in interface AutoCloseable
      Specified by:
      close in interface Closeable
      Throws:
      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 IOException
      Ensure that the RandomAccessBuffer is not closed
      Throws:
      IOException - If RandomAccessBuffer already closed
    • isEOF

      public boolean isEOF() throws 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:
      IOException - If there is an error reading the next byte.
    • createView

      public RandomAccessReadView createView(long startPosition, long streamLength) throws 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:
      IOException - if something went wrong when creating the view for the RandomAccessRead