KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > pdfbox > io > PushBackInputStream


1 /**
2  * Copyright (c) 2003-2006, www.pdfbox.org
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright notice,
9  * this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright notice,
11  * this list of conditions and the following disclaimer in the documentation
12  * and/or other materials provided with the distribution.
13  * 3. Neither the name of pdfbox; nor the names of its
14  * contributors may be used to endorse or promote products derived from this
15  * software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20  * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
24  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  *
28  * http://www.pdfbox.org
29  *
30  */

31 package org.pdfbox.io;
32
33 import java.io.InputStream JavaDoc;
34 import java.io.IOException JavaDoc;
35
36 /**
37  * A simple subclass that adds a few convience methods.
38  *
39  * @author <a HREF="mailto:ben@benlitchfield.com">Ben Litchfield</a>
40  * @version $Revision: 1.6 $
41  */

42 public class PushBackInputStream extends java.io.PushbackInputStream JavaDoc
43 {
44
45     /**
46      * Constructor.
47      *
48      * @param input The input stream.
49      * @param size The size of the push back buffer.
50      *
51      * @throws IOException If there is an error with the stream.
52      */

53     public PushBackInputStream( InputStream JavaDoc input, int size ) throws IOException JavaDoc
54     {
55         super( input, size );
56         if( input == null )
57         {
58             throw new IOException JavaDoc( "Error: input was null" );
59         }
60     }
61
62     /**
63      * This will peek at the next byte.
64      *
65      * @return The next byte on the stream, leaving it as available to read.
66      *
67      * @throws IOException If there is an error reading the next byte.
68      */

69     public int peek() throws IOException JavaDoc
70     {
71         int result = read();
72         if( result != -1 )
73         {
74             unread( result );
75         }
76         return result;
77     }
78
79     /**
80      * A simple test to see if we are at the end of the stream.
81      *
82      * @return true if we are at the end of the stream.
83      *
84      * @throws IOException If there is an error reading the next byte.
85      */

86     public boolean isEOF() throws IOException JavaDoc
87     {
88         int peek = peek();
89         return peek == -1;
90     }
91     
92     /**
93      * This is a method used to fix PDFBox issue 974661, the PDF parsing code needs
94      * to know if there is at least x amount of data left in the stream, but the available()
95      * method returns how much data will be available without blocking. PDFBox is willing to
96      * block to read the data, so we will first fill the internal buffer.
97      *
98      * @throws IOException If there is an error filling the buffer.
99      */

100     public void fillBuffer() throws IOException JavaDoc
101     {
102         int bufferLength = buf.length;
103         byte[] tmpBuffer = new byte[bufferLength];
104         int amountRead = 0;
105         int totalAmountRead = 0;
106         while( amountRead != -1 && totalAmountRead < bufferLength )
107         {
108             amountRead = this.read( tmpBuffer, totalAmountRead, bufferLength - totalAmountRead );
109             if( amountRead != -1 )
110             {
111                 totalAmountRead += amountRead;
112             }
113         }
114         this.unread( tmpBuffer, 0, totalAmountRead );
115     }
116 }
Popular Tags