Package org.apache.pdfbox.io
Class RandomAccessBuffer
- java.lang.Object
-
- org.apache.pdfbox.io.RandomAccessBuffer
-
- All Implemented Interfaces:
java.io.Closeable
,java.lang.AutoCloseable
,java.lang.Cloneable
,RandomAccess
,RandomAccessRead
,RandomAccessWrite
public class RandomAccessBuffer extends java.lang.Object implements RandomAccess, java.lang.Cloneable
An implementation of the RandomAccess 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<byte[]>
bufferList
private int
bufferListIndex
private int
bufferListMaxIndex
private int
chunkSize
private byte[]
currentBuffer
private int
currentBufferPointer
private static int
DEFAULT_CHUNK_SIZE
private long
pointer
private long
size
-
Constructor Summary
Constructors Modifier Constructor Description RandomAccessBuffer()
Default constructor.RandomAccessBuffer(byte[] input)
Create a random access buffer using the given byte array.private
RandomAccessBuffer(int definedChunkSize)
Default constructor.RandomAccessBuffer(java.io.InputStream input)
Create a random access buffer of the given input stream by copying the data.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description int
available()
Returns an estimate of the number of bytes that can be read.private void
checkClosed()
Ensure that the RandomAccessBuffer is not closedvoid
clear()
Clears all data of the buffer.RandomAccessBuffer
clone()
void
close()
private void
expandBuffer()
create a new buffer chunk and adjust all pointers and indices.long
getPosition()
Returns offset of next byte to be returned by a read method.boolean
isClosed()
Returns true if this stream has been closed.boolean
isEOF()
A simple test to see if we are at the end of the data.long
length()
The total number of bytes that are available.private void
nextBuffer()
switch to the next buffer chunk and reset the buffer pointer.int
peek()
This will peek at the next byte.int
read()
Read a single byte of data.int
read(byte[] b)
Read a buffer of data.int
read(byte[] b, int offset, int length)
Read a buffer of data.byte[]
readFully(int length)
Reads a given number of bytes.private int
readRemainingBytes(byte[] b, int offset, int length)
void
rewind(int bytes)
Seek backwards the given number of bytes.void
seek(long position)
Seek to a position in the data.void
write(byte[] b)
Write a buffer of data to the stream.void
write(byte[] b, int offset, int length)
Write a buffer of data to the stream.void
write(int b)
Write a byte to the stream.
-
-
-
Field Detail
-
DEFAULT_CHUNK_SIZE
private static final int DEFAULT_CHUNK_SIZE
- See Also:
- Constant Field Values
-
chunkSize
private int chunkSize
-
bufferList
private java.util.List<byte[]> bufferList
-
currentBuffer
private byte[] currentBuffer
-
pointer
private long pointer
-
currentBufferPointer
private int currentBufferPointer
-
size
private long size
-
bufferListIndex
private int bufferListIndex
-
bufferListMaxIndex
private int bufferListMaxIndex
-
-
Constructor Detail
-
RandomAccessBuffer
public RandomAccessBuffer()
Default constructor.
-
RandomAccessBuffer
private RandomAccessBuffer(int definedChunkSize)
Default constructor.
-
RandomAccessBuffer
public RandomAccessBuffer(byte[] input)
Create a random access buffer using the given byte array.- Parameters:
input
- the byte array to be read
-
RandomAccessBuffer
public RandomAccessBuffer(java.io.InputStream input) throws java.io.IOException
Create a random access buffer of the given input stream by copying the data.- Parameters:
input
- the input stream to be read- Throws:
java.io.IOException
- if something went wrong while copying the data
-
-
Method Detail
-
clone
public RandomAccessBuffer clone()
- Overrides:
clone
in classjava.lang.Object
-
close
public void close() throws java.io.IOException
- Specified by:
close
in interfacejava.lang.AutoCloseable
- Specified by:
close
in interfacejava.io.Closeable
- Throws:
java.io.IOException
-
clear
public void clear()
Clears all data of the buffer.- Specified by:
clear
in interfaceRandomAccessWrite
-
seek
public void seek(long position) throws java.io.IOException
Seek to a position in the data.- Specified by:
seek
in 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.IOException
Returns offset of next byte to be returned by a read method.- Specified by:
getPosition
in 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
-
read
public int read() throws java.io.IOException
Read a single byte of data.- Specified by:
read
in 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.IOException
Read a buffer of data.- Specified by:
read
in 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.IOException
The total number of bytes that are available.- Specified by:
length
in 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.
-
write
public void write(int b) throws java.io.IOException
Write a byte to the stream.- Specified by:
write
in interfaceRandomAccessWrite
- Parameters:
b
- The byte to write.- Throws:
java.io.IOException
- If there is an IO error while writing.
-
write
public void write(byte[] b) throws java.io.IOException
Write a buffer of data to the stream.- Specified by:
write
in interfaceRandomAccessWrite
- Parameters:
b
- The buffer to get the data from.- Throws:
java.io.IOException
- If there is an error while writing the data.
-
write
public void write(byte[] b, int offset, int length) throws java.io.IOException
Write a buffer of data to the stream.- Specified by:
write
in interfaceRandomAccessWrite
- Parameters:
b
- The buffer to get the data from.offset
- An offset into the buffer to get the data from.length
- The length of data to write.- Throws:
java.io.IOException
- If there is an error while writing the data.
-
expandBuffer
private void expandBuffer() throws java.io.IOException
create a new buffer chunk and adjust all pointers and indices.- Throws:
java.io.IOException
-
nextBuffer
private void nextBuffer() throws java.io.IOException
switch to the next buffer chunk and reset the buffer pointer.- Throws:
java.io.IOException
-
checkClosed
private void checkClosed() throws java.io.IOException
Ensure that the RandomAccessBuffer is not closed- Throws:
java.io.IOException
-
isClosed
public boolean isClosed()
Returns true if this stream has been closed.- Specified by:
isClosed
in interfaceRandomAccessRead
-
isEOF
public boolean isEOF() throws java.io.IOException
A simple test to see if we are at the end of the data.- Specified by:
isEOF
in 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.
-
available
public int available() throws java.io.IOException
Returns an estimate of the number of bytes that can be read.- Specified by:
available
in interfaceRandomAccessRead
- Returns:
- the number of bytes that can be read
- Throws:
java.io.IOException
- if this random access has been closed
-
peek
public int peek() throws java.io.IOException
This will peek at the next byte.- Specified by:
peek
in interfaceRandomAccessRead
- Returns:
- The next byte on the stream, leaving it as available to read.
- Throws:
java.io.IOException
- If there is an error reading the next byte.
-
rewind
public void rewind(int bytes) throws java.io.IOException
Seek backwards the given number of bytes.- Specified by:
rewind
in interfaceRandomAccessRead
- Parameters:
bytes
- the number of bytes to be seeked backwards- Throws:
java.io.IOException
- If there is an error while seeking
-
readFully
public byte[] readFully(int length) throws java.io.IOException
Reads a given number of bytes.- Specified by:
readFully
in interfaceRandomAccessRead
- Parameters:
length
- the number of bytes to be read- Returns:
- a byte array containing the bytes just read
- Throws:
java.io.IOException
- if an I/O error occurs while reading data
-
read
public int read(byte[] b) throws java.io.IOException
Read a buffer of data.- Specified by:
read
in interfaceRandomAccessRead
- Parameters:
b
- The buffer to write the data to.- Returns:
- The number of bytes that were actually read.
- Throws:
java.io.IOException
- If there was an error while reading the data.
-
-