com.oreilly.servlet.multipart
Class PartInputStream

java.lang.Object
  extended by java.io.InputStream
      extended by java.io.FilterInputStream
          extended by com.oreilly.servlet.multipart.PartInputStream
All Implemented Interfaces:
java.io.Closeable

public class PartInputStream
extends java.io.FilterInputStream

A PartInputStream filters a ServletInputStream, providing access to a single MIME part contained with in which ends with the boundary specified. It uses buffering to provide maximum performance.

Note the readLine method of ServletInputStream has the annoying habit of adding a \r\n to the end of the last line. Since we want a byte-for-byte transfer, we have to cut those chars. This means that we must always maintain at least 2 characters in our buffer to allow us to trim when necessary.

Version:
1.4, 2002/11/01, fix for "unexpected end of part" caused by boundary newlines split across buffers, 1.3, 2001/05/21, fix to handle boundaries crossing 64K mark, 1.2, 2001/02/07, added read(byte[]) implementation for safety, 1.1, 2000/11/26, fixed available() to never return negative, 1.0, 2000/10/27, initial revision
Author:
Geoff Soutter, Jason Hunter

Method Summary
 int available()
          Returns the number of bytes that can be read from this input stream without blocking.
 void close()
          Closes this input stream and releases any system resources associated with the stream.
 int read()
          See the general contract of the read method of InputStream.
 int read(byte[] b)
          See the general contract of the read method of InputStream.
 int read(byte[] b, int off, int len)
          See the general contract of the read method of InputStream.
 
Methods inherited from class java.io.FilterInputStream
mark, markSupported, reset, skip
 
Methods inherited from class java.lang.Object
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Method Detail

read

public int read()
         throws java.io.IOException
See the general contract of the read method of InputStream.

Returns -1 (end of file) when the MIME boundary of this part is encountered.

Overrides:
read in class java.io.FilterInputStream
Returns:
the next byte of data, or -1 if the end of the stream is reached.
Throws:
java.io.IOException - if an I/O error occurs.

read

public int read(byte[] b)
         throws java.io.IOException
See the general contract of the read method of InputStream.

Returns -1 (end of file) when the MIME boundary of this part is encountered.

Overrides:
read in class java.io.FilterInputStream
Parameters:
b - the buffer into which the data is read.
Returns:
the total number of bytes read into the buffer, or -1 if there is no more data because the end of the stream has been reached.
Throws:
java.io.IOException - if an I/O error occurs.

read

public int read(byte[] b,
                int off,
                int len)
         throws java.io.IOException
See the general contract of the read method of InputStream.

Returns -1 (end of file) when the MIME boundary of this part is encountered.

Overrides:
read in class java.io.FilterInputStream
Parameters:
b - the buffer into which the data is read.
off - the start offset of the data.
len - the maximum number of bytes read.
Returns:
the total number of bytes read into the buffer, or -1 if there is no more data because the end of the stream has been reached.
Throws:
java.io.IOException - if an I/O error occurs.

available

public int available()
              throws java.io.IOException
Returns the number of bytes that can be read from this input stream without blocking. This is a standard InputStream idiom to deal with buffering gracefully, and is not same as the length of the part arriving in this stream.

Overrides:
available in class java.io.FilterInputStream
Returns:
the number of bytes that can be read from the input stream without blocking.
Throws:
java.io.IOException - if an I/O error occurs.

close

public void close()
           throws java.io.IOException
Closes this input stream and releases any system resources associated with the stream.

This method will read any unread data in the MIME part so that the next part starts an an expected place in the parent InputStream. Note that if the client code forgets to call this method on error, MultipartParser will call it automatically if you call readNextPart().

Specified by:
close in interface java.io.Closeable
Overrides:
close in class java.io.FilterInputStream
Throws:
java.io.IOException - if an I/O error occurs.