Package org.apache.pdfbox.io
Class RandomAccessReadBufferedFile
- java.lang.Object
-
- org.apache.pdfbox.io.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 viaFileChanneland is read in ByteBuffer chunks which are cached.
-
-
Field Summary
Fields Modifier and Type Field Description private java.nio.ByteBuffercurPageprivate longcurPageOffsetprivate java.nio.channels.FileChannelfileChannelprivate longfileLengthprivate longfileOffsetprivate booleanisClosedprivate java.nio.ByteBufferlastRemovedCachePageprivate static intMAX_CACHED_PAGESprivate intoffsetWithinPageprivate static longPAGE_OFFSET_MASKprivate static intPAGE_SIZEprivate static intPAGE_SIZE_SHIFTprivate java.util.Map<java.lang.Long,java.nio.ByteBuffer>pageCacheCreate a LRU page cache.private java.nio.file.Pathpathprivate java.util.concurrent.ConcurrentMap<java.lang.Long,RandomAccessReadBufferedFile>rafCopies
-
Constructor Summary
Constructors Constructor Description RandomAccessReadBufferedFile(java.io.File file)Create a random access buffered file instance for the given file.RandomAccessReadBufferedFile(java.lang.String filename)Create a random access buffered file instance for the file with the given name.RandomAccessReadBufferedFile(java.nio.file.Path path)Create a random access buffered file instance using the given path.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description private voidcheckClosed()Ensure that the RandomAccessBuffer is not closedvoidclose()RandomAccessReadViewcreateView(long startPosition, long streamLength)Creates a random access read view starting at the given position with the given length.longgetPosition()Returns offset of next byte to be returned by a read method.booleanisClosed()Returns true if this source has been closed.booleanisEOF()A simple test to see if we are at the end of the data.longlength()The total number of bytes that are available.intread()Read a single byte of data.intread(byte[] b, int off, int len)Read a buffer of data.private java.nio.ByteBufferreadPage()Reads a page with data from current file position.voidseek(long position)Seeks to new position.
-
-
-
Field Detail
-
PAGE_SIZE_SHIFT
private static final int PAGE_SIZE_SHIFT
- See Also:
- Constant Field Values
-
PAGE_SIZE
private static final int PAGE_SIZE
- See Also:
- Constant Field Values
-
PAGE_OFFSET_MASK
private static final long PAGE_OFFSET_MASK
- See Also:
- Constant Field Values
-
MAX_CACHED_PAGES
private static final int MAX_CACHED_PAGES
- See Also:
- Constant Field Values
-
rafCopies
private final java.util.concurrent.ConcurrentMap<java.lang.Long,RandomAccessReadBufferedFile> rafCopies
-
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.IOExceptionCreate 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.IOExceptionCreate 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.IOExceptionCreate 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.IOExceptionDescription copied from interface:RandomAccessReadReturns offset of next byte to be returned by a read method.- Specified by:
getPositionin interfaceRandomAccessRead- 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.IOExceptionSeeks 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:
seekin interfaceRandomAccessRead- Parameters:
position- the position to seek to.- Throws:
java.io.IOException- if something went wrong.
-
readPage
private java.nio.ByteBuffer readPage() throws java.io.IOExceptionReads 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.IOExceptionDescription copied from interface:RandomAccessReadRead a single byte of data.- Specified by:
readin interfaceRandomAccessRead- 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.IOExceptionDescription copied from interface:RandomAccessReadRead a buffer of data.- Specified by:
readin interfaceRandomAccessRead- 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.IOExceptionDescription copied from interface:RandomAccessReadThe total number of bytes that are available.- Specified by:
lengthin interfaceRandomAccessRead- 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:
closein interfacejava.lang.AutoCloseable- Specified by:
closein interfacejava.io.Closeable- Throws:
java.io.IOException
-
isClosed
public boolean isClosed()
Description copied from interface:RandomAccessReadReturns true if this source has been closed.- Specified by:
isClosedin interfaceRandomAccessRead- Returns:
- true if the source has been closed
-
checkClosed
private void checkClosed() throws java.io.IOExceptionEnsure that the RandomAccessBuffer is not closed- Throws:
java.io.IOException- If RandomAccessBuffer already closed
-
isEOF
public boolean isEOF() throws java.io.IOExceptionDescription copied from interface:RandomAccessReadA simple test to see if we are at the end of the data.- Specified by:
isEOFin interfaceRandomAccessRead- 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:RandomAccessReadCreates a random access read view starting at the given position with the given length.- Specified by:
createViewin interfaceRandomAccessRead- Parameters:
startPosition- start position within the underlying random access readstreamLength- stream length- Returns:
- the random access read view
- Throws:
java.io.IOException- if something went wrong when creating the view for the RandomAccessRead
-
-