diff options
| author | John Leuner <jewel@pixie.co.za> | 2001-09-07 12:44:14 +0000 |
|---|---|---|
| committer | John Leuner <jewel@pixie.co.za> | 2001-09-07 12:44:14 +0000 |
| commit | 07283c734f54cf1ff1952da9167f2eccddb85c47 (patch) | |
| tree | b965581614a9c892d2d276240a1c59e124aec7ff /java/util/zip/InflaterInputStream.java | |
| parent | 242fb218cfca462a5955ab4a9d323fc50a268e26 (diff) | |
| download | classpath-07283c734f54cf1ff1952da9167f2eccddb85c47.tar.gz | |
including jazzlib into classpath tree
Diffstat (limited to 'java/util/zip/InflaterInputStream.java')
| -rw-r--r-- | java/util/zip/InflaterInputStream.java | 216 |
1 files changed, 216 insertions, 0 deletions
diff --git a/java/util/zip/InflaterInputStream.java b/java/util/zip/InflaterInputStream.java new file mode 100644 index 000000000..eca75e8c1 --- /dev/null +++ b/java/util/zip/InflaterInputStream.java @@ -0,0 +1,216 @@ +/* java.util.zip.InflaterInputStream + Copyright (C) 2001 Free Software Foundation, Inc. + +This file is part of Jazzlib. + +Jazzlib is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +Jazzlib is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GNU Classpath; see the file COPYING. If not, write to the +Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +02111-1307 USA. + +As a special exception, if you link this library with other files to +produce an executable, this library does not by itself cause the +resulting executable to be covered by the GNU General Public License. +This exception does not however invalidate any other reasons why the +executable file might be covered by the GNU General Public License. */ + +package java.util.zip; + +import java.io.FilterInputStream; +import java.io.InputStream; +import java.io.IOException; + +/** + * This filter stream is used to decompress data compressed in the "deflate" + * format. The "deflate" format is described in RFC 1951. + * + * This stream may form the basis for other decompression filters, such + * as the <code>GZIPInputStream</code>. + * + * @author John Leuner + * @since JDK 1.1 + */ + +public class InflaterInputStream extends FilterInputStream { + + //Variables + + /** + * Decompressor for this filter + */ + + protected Inflater inf; + + /** + * Byte array used as a buffer + */ + + protected byte[] buf; + + /** + * Size of buffer + */ + + protected int len; + + + //We just use this if we are decoding one byte at a time with the read() call + + private byte[] onebytebuffer = new byte[1]; + + //Constructors + + + /** + * Create an InflaterInputStream with the default decompresseor + * and a default buffer size. + * + * @param in the InputStream to read bytes from + */ + + public InflaterInputStream(InputStream in) + { + this(in, new Inflater(), 4096); + } + + /** + * Create an InflaterInputStream with the specified decompresseor + * and a default buffer size. + * + * @param in the InputStream to read bytes from + * @param inf the decompressor used to decompress data read from in + */ + + public InflaterInputStream(InputStream in, Inflater inf) + { + this(in, inf, 4096); + } + + /** + * Create an InflaterInputStream with the specified decompresseor + * and a specified buffer size. + * + * @param in the InputStream to read bytes from + * @param inf the decompressor used to decompress data read from in + * @param size size of the buffer to use + */ + + public InflaterInputStream(InputStream in, Inflater inf, int size) + { + super(in); + this.inf = inf; + this.len = 0; + + if (size <= 0) + throw new IllegalArgumentException("size <= 0"); + buf = new byte[size]; //Create the buffer + } + + //Methods + + /** + * Returns 0 once the end of the stream (EOF) has been reached. + * Otherwise returns 1. + */ + + public int available() throws IOException + { + return inf.finished() ? 0 : 1; + } + + /** + * Closes the input stream + */ + public void close() throws IOException + { + in.close(); + } + + /** + * Fills the buffer with more data to decompress. + */ + protected void fill() throws IOException + { + len = in.read(buf, 0, buf.length); + + if (len < 0) + throw new ZipException("Deflated stream ends early."); + inf.setInput(buf, 0, len); + } + + /** + * Reads one byte of decompressed data. + * + * The byte is in the lower 8 bits of the int. + */ + public int read() throws IOException + { + int nread = read(onebytebuffer, 0, 1); //read one byte + if (nread > 0) + return onebytebuffer[0] & 0xff; + return -1; + } + + /** + * Decompresses data into the byte array + * + * + * @param b the array to read and decompress data into + * @param off the offset indicating where the data should be placed + * @param len the number of bytes to decompress + */ + public int read(byte[] b, int off, int len) throws IOException + { + for (;;) + { + int count; + try + { + count = inf.inflate(b, off, len); + } + catch (DataFormatException dfe) + { + throw new ZipException(dfe.getMessage()); + } + + if (count > 0) + return count; + + if (inf.needsDictionary()) + throw new ZipException("Need a dictionary"); + else if (inf.finished()) + return -1; + else if (inf.needsInput()) + fill(); + else + throw new InternalError("Don't know what to do"); + } + } + + /** + * Skip specified number of bytes of uncompressed data + * + * @param n number of bytes to skip + */ + + public long skip(long n) throws IOException + { + if (n < 0) + throw new IllegalArgumentException(); + int len = 2048; + if (n < len) + len = (int) n; + byte[] tmp = new byte[len]; + return (long) read(tmp); + } +} |
