FileDocCategorySizeDatePackage
GZIPInputStream.javaAPI DocJava SE 5 API5774Fri Aug 26 14:57:28 BST 2005java.util.zip

GZIPInputStream

public class GZIPInputStream extends InflaterInputStream
This class implements a stream filter for reading compressed data in the GZIP file format.
see
InflaterInputStream
version
1.28, 06/11/04
author
David Connelly

Fields Summary
protected CRC32
crc
CRC-32 for uncompressed data.
protected boolean
eos
Indicates end of input stream.
private boolean
closed
public static final int
GZIP_MAGIC
GZIP header magic number.
private static final int
FTEXT
private static final int
FHCRC
private static final int
FEXTRA
private static final int
FNAME
private static final int
FCOMMENT
private byte[]
tmpbuf
Constructors Summary
public GZIPInputStream(InputStream in, int size)
Creates a new input stream with the specified buffer size.

param
in the input stream
param
size the input buffer size
exception
IOException if an I/O error has occurred
exception
IllegalArgumentException if size is <= 0

	super(in, new Inflater(true), size);
        usesDefaultInflater = true;
	readHeader();
	crc.reset();
    
public GZIPInputStream(InputStream in)
Creates a new input stream with a default buffer size.

param
in the input stream
exception
IOException if an I/O error has occurred

	this(in, 512);
    
Methods Summary
public voidclose()
Closes this input stream and releases any system resources associated with the stream.

exception
IOException if an I/O error has occurred

        if (!closed) {
            super.close();	
            eos = true;
            closed = true;
        }
    
private voidensureOpen()
Check to make sure that this stream has not been closed

    
                    
         
	if (closed) {
	    throw new IOException("Stream closed");
        }
    
public intread(byte[] buf, int off, int len)
Reads uncompressed data into an array of bytes. Blocks until enough input is available for decompression.

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 actual number of bytes read, or -1 if the end of the compressed input stream is reached
exception
IOException if an I/O error has occurred or the compressed input data is corrupt

        ensureOpen();
	if (eos) {
	    return -1;
	}
	len = super.read(buf, off, len);
	if (len == -1) {
	    readTrailer();
	    eos = true;
	} else {
	    crc.update(buf, off, len);
	}
	return len;
    
private voidreadHeader()

	// File comment

    /*
     * Reads GZIP member header.
     */
         
	CheckedInputStream in = new CheckedInputStream(this.in, crc);
	crc.reset();
	// Check header magic
	if (readUShort(in) != GZIP_MAGIC) {
	    throw new IOException("Not in GZIP format");
	}
	// Check compression method
	if (readUByte(in) != 8) {
	    throw new IOException("Unsupported compression method");
	}
	// Read flags
	int flg = readUByte(in);
	// Skip MTIME, XFL, and OS fields
	skipBytes(in, 6);
	// Skip optional extra field
	if ((flg & FEXTRA) == FEXTRA) {
	    skipBytes(in, readUShort(in));
	}
	// Skip optional file name
	if ((flg & FNAME) == FNAME) {
	    while (readUByte(in) != 0) ;
	}
	// Skip optional file comment
	if ((flg & FCOMMENT) == FCOMMENT) {
	    while (readUByte(in) != 0) ;
	}
	// Check optional header CRC
	if ((flg & FHCRC) == FHCRC) {
	    int v = (int)crc.getValue() & 0xffff;
	    if (readUShort(in) != v) {
		throw new IOException("Corrupt GZIP header");
	    }
	}
    
private voidreadTrailer()

	InputStream in = this.in;
	int n = inf.getRemaining();
	if (n > 0) {
	    in = new SequenceInputStream(
			new ByteArrayInputStream(buf, len - n, n), in);
	}
	long v = crc.getValue();
	if (readUInt(in) != v || readUInt(in) != inf.getTotalOut()) {
	    throw new IOException("Corrupt GZIP trailer");
	}
    
private intreadUByte(java.io.InputStream in)

	int b = in.read();
	if (b == -1) {
	    throw new EOFException();
	}
	return b;
    
private longreadUInt(java.io.InputStream in)

	long s = readUShort(in);
	return ((long)readUShort(in) << 16) | s;
    
private intreadUShort(java.io.InputStream in)

	int b = readUByte(in);
	return ((int)readUByte(in) << 8) | b;
    
private voidskipBytes(java.io.InputStream in, int n)


    /*
     * Skips bytes of input data blocking until all bytes are skipped.
     * Does not assume that the input stream is capable of seeking.
     */
            
	while (n > 0) {
	    int len = in.read(tmpbuf, 0, n < tmpbuf.length ? n : tmpbuf.length);
	    if (len == -1) {
		throw new EOFException();
	    }
	    n -= len;
	}