int
in the range 0
* to 255
. If no byte is available because the end of
* the stream has been reached, the value -1
is returned.
* This method blocks until input data is available, the end of the
* stream is detected, or an exception is thrown.
*
* @return the next byte of data, or -1
if the end of the
* stream is reached.
* @exception IOException if an I/O error occurs.
*/
@Override
public int read() throws IOException {
if (spaces > 0) {
// We have cached space characters, return one
spaces--;
return ' ';
}
int c = in.read();
if (c == ' ') {
// Got space, keep reading till we get a non-space char
while ((c = in.read()) == ' ')
spaces++;
if (c == '\r' || c == '\n' || c == -1)
// If the non-space char is CR/LF/EOF, the spaces we got
// so far is junk introduced during transport. Junk 'em.
spaces = 0;
else {
// The non-space char is NOT CR/LF, the spaces are valid.
((PushbackInputStream)in).unread(c);
c = ' ';
}
return c; // return either len
decoded bytes of data from this input stream
* into an array of bytes. This method blocks until some input is
* available.
*
*
* @param buf the buffer into which the data is read.
* @param off the start offset of the data.
* @param len the maximum number of bytes read.
* @return 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.
* @exception IOException if an I/O error occurs.
*/
@Override
public int read(byte[] buf, int off, int len) throws IOException {
int i, c;
for (i = 0; i < len; i++) {
if ((c = read()) == -1) {
if (i == 0) // At end of stream, so we should
i = -1; // return -1 , NOT 0.
break;
}
buf[off+i] = (byte)c;
}
return i;
}
/**
* Tests if this input stream supports marks. Currently this class
* does not support marks
*/
@Override
public boolean markSupported() {
return false;
}
/**
* Returns the number of bytes that can be read from this input
* stream without blocking. The QP algorithm does not permit
* a priori knowledge of the number of bytes after decoding, so
* this method just invokes the available
method
* of the original input stream.
*/
@Override
public int available() throws IOException {
// This is bogus ! We don't really know how much
// bytes are available *after* decoding
return in.available();
}
/**** begin TEST program
public static void main(String argv[]) throws Exception {
FileInputStream infile = new FileInputStream(argv[0]);
QPDecoderStream decoder = new QPDecoderStream(infile);
int c;
while ((c = decoder.read()) != -1)
System.out.print((char)c);
System.out.println();
}
*** end TEST program ****/
}