org.apache.pdfbox.io
Class PushBackInputStream

java.lang.Object
  extended by java.io.InputStream
      extended by java.io.FilterInputStream
          extended by java.io.PushbackInputStream
              extended by org.apache.pdfbox.io.PushBackInputStream
All Implemented Interfaces:
java.io.Closeable
Direct Known Subclasses:
ByteArrayPushBackInputStream

public class PushBackInputStream
extends java.io.PushbackInputStream

A simple subclass that adds a few convience methods.

Version:
$Revision: 1.6 $
Author:
Ben Litchfield

Field Summary
 
Fields inherited from class java.io.PushbackInputStream
buf, pos
 
Fields inherited from class java.io.FilterInputStream
in
 
Constructor Summary
PushBackInputStream(java.io.InputStream input, int size)
          Constructor.
 
Method Summary
 void fillBuffer()
          This is a method used to fix PDFBox issue 974661, the PDF parsing code needs to know if there is at least x amount of data left in the stream, but the available() method returns how much data will be available without blocking.
 long getOffset()
          Returns the current byte offset in the file.
 boolean isEOF()
          A simple test to see if we are at the end of the stream.
 int peek()
          This will peek at the next byte.
 int read()
          
 int read(byte[] b)
          
 int read(byte[] b, int off, int len)
          
 byte[] readFully(int length)
          Reads a given number of bytes from the underlying stream.
 void seek(long newOffset)
          Allows to seek to another position within stream in case the underlying stream implements RandomAccessRead.
 void unread(byte[] b)
          
 void unread(byte[] b, int off, int len)
          
 void unread(int b)
          
 
Methods inherited from class java.io.PushbackInputStream
available, close, mark, markSupported, reset, skip
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

PushBackInputStream

public PushBackInputStream(java.io.InputStream input,
                           int size)
                    throws java.io.IOException
Constructor.

Parameters:
input - The input stream.
size - The size of the push back buffer.
Throws:
java.io.IOException - If there is an error with the stream.
Method Detail

peek

public int peek()
         throws java.io.IOException
This will peek at the next byte.

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.

getOffset

public long getOffset()
Returns the current byte offset in the file.

Returns:
the int byte offset

read

public int read()
         throws java.io.IOException

Overrides:
read in class java.io.PushbackInputStream
Throws:
java.io.IOException

read

public int read(byte[] b)
         throws java.io.IOException

Overrides:
read in class java.io.FilterInputStream
Throws:
java.io.IOException

read

public int read(byte[] b,
                int off,
                int len)
         throws java.io.IOException

Overrides:
read in class java.io.PushbackInputStream
Throws:
java.io.IOException

unread

public void unread(int b)
            throws java.io.IOException

Overrides:
unread in class java.io.PushbackInputStream
Throws:
java.io.IOException

unread

public void unread(byte[] b)
            throws java.io.IOException

Overrides:
unread in class java.io.PushbackInputStream
Throws:
java.io.IOException

unread

public void unread(byte[] b,
                   int off,
                   int len)
            throws java.io.IOException

Overrides:
unread in class java.io.PushbackInputStream
Throws:
java.io.IOException

isEOF

public boolean isEOF()
              throws java.io.IOException
A simple test to see if we are at the end of the stream.

Returns:
true if we are at the end of the stream.
Throws:
java.io.IOException - If there is an error reading the next byte.

fillBuffer

public void fillBuffer()
                throws java.io.IOException
This is a method used to fix PDFBox issue 974661, the PDF parsing code needs to know if there is at least x amount of data left in the stream, but the available() method returns how much data will be available without blocking. PDFBox is willing to block to read the data, so we will first fill the internal buffer.

Throws:
java.io.IOException - If there is an error filling the buffer.

readFully

public byte[] readFully(int length)
                 throws java.io.IOException
Reads a given number of bytes from the underlying stream.

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

seek

public void seek(long newOffset)
          throws java.io.IOException
Allows to seek to another position within stream in case the underlying stream implements RandomAccessRead. Otherwise an IOException is thrown. Pushback buffer is cleared before seek operation by skipping over all bytes of buffer.

Parameters:
newOffset - new position within stream from which to read next
Throws:
java.io.IOException - if underlying stream does not implement RandomAccessRead or seek operation on underlying stream was not successful