Package org.apache.pdfbox.io
Class NonSeekableRandomAccessReadInputStream
- java.lang.Object
-
- org.apache.pdfbox.io.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.
-
-
Field Summary
Fields Modifier and Type Field Description private static intBUFFER_SIZEprivate int[]bufferBytesprivate byte[][]buffersprivate static intCURRENTprotected intcurrentBufferPointerprivate java.io.InputStreamisprivate booleanisClosedprivate booleanisEOFprivate static intLASTprivate static org.apache.commons.logging.LogLOGprivate static intNEXTprotected longpositionprotected longsize
-
Constructor Summary
Constructors Constructor Description NonSeekableRandomAccessReadInputStream(java.io.InputStream inputStream)Default constructor.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description protected 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.private booleanfetch()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 offset, int length)Read a buffer of data.voidrewind(int bytes)Seek backwards the given number of bytes.voidseek(long position)Seek to a position in the data.voidskip(int length)Skips a given number of bytes.private voidswitchBuffers(int firstBuffer, int secondBuffer)-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Methods inherited from interface org.apache.pdfbox.io.RandomAccessRead
available, peek, read
-
-
-
-
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
-
BUFFER_SIZE
private static final int BUFFER_SIZE
- See Also:
- Constant Field Values
-
CURRENT
private static final int CURRENT
- See Also:
- Constant Field Values
-
LAST
private static final int LAST
- See Also:
- Constant Field Values
-
NEXT
private static final int NEXT
- See Also:
- Constant Field Values
-
buffers
private final byte[][] buffers
-
bufferBytes
private final int[] bufferBytes
-
isClosed
private boolean isClosed
-
isEOF
private boolean isEOF
-
-
Method Detail
-
close
public void close() throws java.io.IOException- Specified by:
closein interfacejava.lang.AutoCloseable- Specified by:
closein interfacejava.io.Closeable- Throws:
java.io.IOException
-
seek
public void seek(long position) throws java.io.IOExceptionSeek to a position in the data.- Specified by:
seekin interfaceRandomAccessRead- 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.IOExceptionDescription copied from interface:RandomAccessReadSkips a given number of bytes.- Specified by:
skipin interfaceRandomAccessRead- 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.IOExceptionReturns 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
-
read
public int read() throws java.io.IOExceptionRead 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 offset, int length) throws java.io.IOExceptionRead a buffer of data.- Specified by:
readin interfaceRandomAccessRead- 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.IOExceptionThe 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.
-
rewind
public void rewind(int bytes) throws java.io.IOExceptionDescription copied from interface:RandomAccessReadSeek backwards the given number of bytes.- Specified by:
rewindin interfaceRandomAccessRead- 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.IOExceptionEnsure 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:
isClosedin interfaceRandomAccessRead- Returns:
- true if the source has been closed
-
isEOF
public boolean isEOF() throws java.io.IOExceptionA 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
-
-