summaryrefslogtreecommitdiff
path: root/java/util/zip/InflaterInputStream.java
diff options
context:
space:
mode:
authorJohn Leuner <jewel@pixie.co.za>2001-09-07 12:44:14 +0000
committerJohn Leuner <jewel@pixie.co.za>2001-09-07 12:44:14 +0000
commit07283c734f54cf1ff1952da9167f2eccddb85c47 (patch)
treeb965581614a9c892d2d276240a1c59e124aec7ff /java/util/zip/InflaterInputStream.java
parent242fb218cfca462a5955ab4a9d323fc50a268e26 (diff)
downloadclasspath-07283c734f54cf1ff1952da9167f2eccddb85c47.tar.gz
including jazzlib into classpath tree
Diffstat (limited to 'java/util/zip/InflaterInputStream.java')
-rw-r--r--java/util/zip/InflaterInputStream.java216
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);
+ }
+}