Package org.apache.pdfbox.io
Class ScratchFileBuffer
java.lang.Object
org.apache.pdfbox.io.ScratchFileBuffer
- All Implemented Interfaces:
Closeable,AutoCloseable,RandomAccess,RandomAccessRead,RandomAccessWrite
Implementation of
RandomAccess as sequence of multiple fixed size pages handled
by ScratchFile.-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate byte[]The current page data.private booleantrueif current page was changed by a write methodprivate longThe offset of the current page within this buffer.private intIndex of current page inpageIndexes(the nth page within this buffer).private intnumber of pages held by this bufferprivate ScratchFileThe underlying page handler.private int[]contains ordered list of pages with the index the page is known by page handler (ScratchFile)private final intprivate intThe current position (for next read/write) of the buffer as an offset in the current page.private longThe number of bytes of content in this buffer. -
Constructor Summary
ConstructorsConstructorDescriptionScratchFileBuffer(ScratchFile pageHandler) Creates a new buffer using pages handled by providedScratchFile. -
Method Summary
Modifier and TypeMethodDescriptionprivate voidaddPage()Adds a new page and positions all pointers to start of new page.intReturns an estimate of the number of bytes that can be read.private voidChecks if this buffer, or the underlyingScratchFilehave been closed, throwingIOExceptionif so.final voidclear()Clears all data of the buffer.voidclose()(package private) voidclose(boolean removeBuffer) Release all resources and remove this buffer from ScratchFile.private booleanensureAvailableBytesInPage(boolean addNewPageIfNeeded) Ensures the current page has at least one byte left (positionInPagein <pageSize).longReturns offset of next byte to be returned by a read method.booleanisClosed()Returns true if this stream 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.intpeek()This will peek at the next byte.intread()Read a single byte of data.intread(byte[] b) Read a buffer of data.intread(byte[] b, int off, int len) Read a buffer of data.byte[]readFully(int length) Reads a given number of bytes.voidrewind(int bytes) Seek backwards the given number of bytes.voidseek(long seekToPosition) Seek to a position in the data.voidwrite(byte[] b) Write a buffer of data to the stream.voidwrite(byte[] b, int off, int len) Write a buffer of data to the stream.voidwrite(int b) Write a byte to the stream.
-
Field Details
-
pageSize
private final int pageSize -
pageHandler
The underlying page handler. -
size
private long sizeThe number of bytes of content in this buffer. -
currentPagePositionInPageIndexes
private int currentPagePositionInPageIndexesIndex of current page inpageIndexes(the nth page within this buffer). -
currentPageOffset
private long currentPageOffsetThe offset of the current page within this buffer. -
currentPage
private byte[] currentPageThe current page data. -
positionInPage
private int positionInPageThe current position (for next read/write) of the buffer as an offset in the current page. -
currentPageContentChanged
private boolean currentPageContentChangedtrueif current page was changed by a write method -
pageIndexes
private int[] pageIndexescontains ordered list of pages with the index the page is known by page handler (ScratchFile) -
pageCount
private int pageCountnumber of pages held by this buffer
-
-
Constructor Details
-
ScratchFileBuffer
ScratchFileBuffer(ScratchFile pageHandler) throws IOException Creates a new buffer using pages handled by providedScratchFile.- Parameters:
pageHandler- TheScratchFilemanaging the pages to be used by this buffer.- Throws:
IOException- If getting first page failed.
-
-
Method Details
-
checkClosed
Checks if this buffer, or the underlyingScratchFilehave been closed, throwingIOExceptionif so.- Throws:
IOException- If either this buffer, or the underlyingScratchFilehave been closed.
-
addPage
Adds a new page and positions all pointers to start of new page.- Throws:
IOException- if requesting a new page fails
-
length
The total number of bytes that are available.- Specified by:
lengthin interfaceRandomAccessRead- Returns:
- The number of bytes available.
- Throws:
IOException- If there is an IO error while determining the length of the data stream.
-
ensureAvailableBytesInPage
Ensures the current page has at least one byte left (positionInPagein <pageSize).If this is not the case we go to next page (writing current one if changed). If current buffer has no more pages we add a new one.
- Parameters:
addNewPageIfNeeded- iftrueit is allowed to add a new page in case we are currently at end of last buffer page- Returns:
trueif we were successful positioning pointer before end of page; we might returnfalseif it is not allowed to add another page and current pointer points at end of last page- Throws:
IOException
-
write
Write a byte to the stream.- Specified by:
writein interfaceRandomAccessWrite- Parameters:
b- The byte to write.- Throws:
IOException- If there is an IO error while writing.
-
write
Write a buffer of data to the stream.- Specified by:
writein interfaceRandomAccessWrite- Parameters:
b- The buffer to get the data from.- Throws:
IOException- If there is an error while writing the data.
-
write
Write a buffer of data to the stream.- Specified by:
writein interfaceRandomAccessWrite- Parameters:
b- The buffer to get the data from.off- An offset into the buffer to get the data from.len- The length of data to write.- Throws:
IOException- If there is an error while writing the data.
-
clear
Clears all data of the buffer.- Specified by:
clearin interfaceRandomAccessWrite- Throws:
IOException
-
getPosition
Returns 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:
IOException
-
seek
Seek to a position in the data.- Specified by:
seekin interfaceRandomAccessRead- Parameters:
seekToPosition- The position to seek to.- Throws:
IOException- If there is an error while seeking.
-
isClosed
public boolean isClosed()Returns true if this stream has been closed.- Specified by:
isClosedin interfaceRandomAccessRead
-
peek
This will peek at the next byte.- Specified by:
peekin interfaceRandomAccessRead- Returns:
- The next byte on the stream, leaving it as available to read.
- Throws:
IOException- If there is an error reading the next byte.
-
rewind
Seek backwards the given number of bytes.- Specified by:
rewindin interfaceRandomAccessRead- Parameters:
bytes- the number of bytes to be seeked backwards- Throws:
IOException- If there is an error while seeking
-
readFully
Reads a given number of bytes.- Specified by:
readFullyin interfaceRandomAccessRead- Parameters:
length- the number of bytes to be read- Returns:
- a byte array containing the bytes just read
- Throws:
IOException- if an I/O error occurs while reading data
-
isEOF
A 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:
IOException- If there is an error reading the next byte.
-
available
Returns an estimate of the number of bytes that can be read.- Specified by:
availablein interfaceRandomAccessRead- Returns:
- the number of bytes that can be read
- Throws:
IOException- if this random access has been closed
-
read
Read a single byte of data.- Specified by:
readin interfaceRandomAccessRead- Returns:
- The byte of data that is being read.
- Throws:
IOException- If there is an error while reading the data.
-
read
Read a buffer of data.- Specified by:
readin interfaceRandomAccessRead- Parameters:
b- The buffer to write the data to.- Returns:
- The number of bytes that were actually read.
- Throws:
IOException- If there was an error while reading the data.
-
read
Read 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:
IOException- If there was an error while reading the data.
-
close
- Specified by:
closein interfaceAutoCloseable- Specified by:
closein interfaceCloseable- Throws:
IOException
-
close
void close(boolean removeBuffer) Release all resources and remove this buffer from ScratchFile.- Parameters:
removeBuffer- remove buffer from ScratchFile if set to true
-