Package org.apache.pdfbox.io
Class RandomAccessReadBuffer
- java.lang.Object
-
- org.apache.pdfbox.io.RandomAccessReadBuffer
-
- All Implemented Interfaces:
java.io.Closeable,java.lang.AutoCloseable,RandomAccessRead
- Direct Known Subclasses:
RandomAccessReadWriteBuffer
public class RandomAccessReadBuffer extends java.lang.Object implements RandomAccessRead
An implementation of the RandomAccessRead interface to store data in memory. The data will be stored in chunks organized in an ArrayList.
-
-
Field Summary
Fields Modifier and Type Field Description private java.util.List<java.nio.ByteBuffer>bufferListprivate intbufferListIndexprivate intbufferListMaxIndexprotected intchunkSizeprotected java.nio.ByteBuffercurrentBufferprotected intcurrentBufferPointerstatic intDEFAULT_CHUNK_SIZE_4KBprotected longpointerprivate java.util.concurrent.ConcurrentMap<java.lang.Long,RandomAccessReadBuffer>rarbCopiesprotected longsize
-
Constructor Summary
Constructors Modifier Constructor Description protectedRandomAccessReadBuffer()Default constructor.RandomAccessReadBuffer(byte[] input)Create a random access buffer using the given byte array.protectedRandomAccessReadBuffer(int definedChunkSize)Default constructor.RandomAccessReadBuffer(java.io.InputStream input)Create a random access read buffer of the given input stream by copying the data to the memory.RandomAccessReadBuffer(java.nio.ByteBuffer input)Create a random access buffer using the given ByteBuffer.privateRandomAccessReadBuffer(RandomAccessReadBuffer parent)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description protected voidcheckClosed()Ensure that the RandomAccessBuffer is not closedvoidclose()static RandomAccessReadBuffercreateBufferFromStream(java.io.InputStream inputStream)Create e new RandomAccessReadBuffer using the given InputStream.RandomAccessReadViewcreateView(long startPosition, long streamLength)Creates a random access read view starting at the given position with the given length.protected voidexpandBuffer()create a new buffer chunk and adjust all pointers and indices.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.private voidnextBuffer()switch to the next buffer chunk and reset the buffer pointer.intread()Read a single byte of data.intread(byte[] b, int offset, int length)Read a buffer of data.private intreadRemainingBytes(byte[] b, int offset, int length)protected voidresetBuffers()Reset to position 0 and remove all buffers but the first one.voidseek(long position)Seek to a position in the data.
-
-
-
Field Detail
-
DEFAULT_CHUNK_SIZE_4KB
public static final int DEFAULT_CHUNK_SIZE_4KB
- See Also:
- Constant Field Values
-
chunkSize
protected int chunkSize
-
bufferList
private final java.util.List<java.nio.ByteBuffer> bufferList
-
currentBuffer
protected java.nio.ByteBuffer currentBuffer
-
pointer
protected long pointer
-
currentBufferPointer
protected int currentBufferPointer
-
size
protected long size
-
bufferListIndex
private int bufferListIndex
-
bufferListMaxIndex
private int bufferListMaxIndex
-
rarbCopies
private final java.util.concurrent.ConcurrentMap<java.lang.Long,RandomAccessReadBuffer> rarbCopies
-
-
Constructor Detail
-
RandomAccessReadBuffer
protected RandomAccessReadBuffer()
Default constructor.
-
RandomAccessReadBuffer
protected RandomAccessReadBuffer(int definedChunkSize)
Default constructor.
-
RandomAccessReadBuffer
public RandomAccessReadBuffer(byte[] input)
Create a random access buffer using the given byte array.- Parameters:
input- the byte array to be read
-
RandomAccessReadBuffer
public RandomAccessReadBuffer(java.nio.ByteBuffer input)
Create a random access buffer using the given ByteBuffer.- Parameters:
input- the ByteBuffer to be read
-
RandomAccessReadBuffer
public RandomAccessReadBuffer(java.io.InputStream input) throws java.io.IOExceptionCreate a random access read buffer of the given input stream by copying the data to the memory.- Parameters:
input- the input stream to be read- Throws:
java.io.IOException- if something went wrong while copying the data
-
RandomAccessReadBuffer
private RandomAccessReadBuffer(RandomAccessReadBuffer parent)
-
-
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.
-
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.
-
readRemainingBytes
private int readRemainingBytes(byte[] b, int offset, int length)
-
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.
-
expandBuffer
protected void expandBuffer() throws java.io.IOExceptioncreate a new buffer chunk and adjust all pointers and indices.- Throws:
java.io.IOException
-
nextBuffer
private void nextBuffer() throws java.io.IOExceptionswitch to the next buffer chunk and reset the buffer pointer.- Throws:
java.io.IOException
-
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
-
createBufferFromStream
public static RandomAccessReadBuffer createBufferFromStream(java.io.InputStream inputStream) throws java.io.IOException
Create e new RandomAccessReadBuffer using the given InputStream. The data is copied to the memory and the InputStream is closed.- Parameters:
inputStream- the InputStream holding the data to be copied- Returns:
- the RandomAccessReadBuffer holding the data of the InputStream
- Throws:
java.io.IOException- if something went wrong while copying the data
-
resetBuffers
protected void resetBuffers()
Reset to position 0 and remove all buffers but the first one.
-
-