FileDocCategorySizeDatePackage
DeflaterOutputStream.javaAPI DocJava SE 6 API4753Tue Jun 10 00:26:00 BST 2008java.util.zip

DeflaterOutputStream

public class DeflaterOutputStream extends FilterOutputStream
This class implements an output stream filter for compressing data in the "deflate" compression format. It is also used as the basis for other types of compression filters, such as GZIPOutputStream.
see
Deflater
version
1.36, 03/13/06
author
David Connelly

Fields Summary
protected Deflater
def
Compressor for this stream.
protected byte[]
buf
Output buffer for writing compressed data.
private boolean
closed
Indicates that the stream has been closed.
boolean
usesDefaultDeflater
Constructors Summary
public DeflaterOutputStream(OutputStream out, Deflater def, int size)
Creates a new output stream with the specified compressor and buffer size.

param
out the output stream
param
def the compressor ("deflater")
param
size the output buffer size
exception
IllegalArgumentException if size is <= 0


                                            
           
        super(out);
        if (out == null || def == null) {
            throw new NullPointerException();
        } else if (size <= 0) {
            throw new IllegalArgumentException("buffer size <= 0");
        }
        this.def = def;
        buf = new byte[size];
    
public DeflaterOutputStream(OutputStream out, Deflater def)
Creates a new output stream with the specified compressor and a default buffer size.

param
out the output stream
param
def the compressor ("deflater")

	this(out, def, 512);
    
public DeflaterOutputStream(OutputStream out)
Creates a new output stream with a default compressor and buffer size.

param
out the output stream


                          
       
	this(out, new Deflater());
        usesDefaultDeflater = true;
    
Methods Summary
public voidclose()
Writes remaining compressed data to the output stream and closes the underlying stream.

exception
IOException if an I/O error has occurred

        if (!closed) {
            finish();
            if (usesDefaultDeflater)
                def.end();
            out.close();
            closed = true;
        }
    
protected voiddeflate()
Writes next block of compressed data to the output stream.

throws
IOException if an I/O error has occurred

	int len = def.deflate(buf, 0, buf.length);
	if (len > 0) {
	    out.write(buf, 0, len);
	}
    
public voidfinish()
Finishes writing compressed data to the output stream without closing the underlying stream. Use this method when applying multiple filters in succession to the same output stream.

exception
IOException if an I/O error has occurred

	if (!def.finished()) {
	    def.finish();
	    while (!def.finished()) {
		deflate();
	    }
	}
    
public voidwrite(int b)
Writes a byte to the compressed output stream. This method will block until the byte can be written.

param
b the byte to be written
exception
IOException if an I/O error has occurred

        byte[] buf = new byte[1];
	buf[0] = (byte)(b & 0xff);
	write(buf, 0, 1);
    
public voidwrite(byte[] b, int off, int len)
Writes an array of bytes to the compressed output stream. This method will block until all the bytes are written.

param
b the data to be written
param
off the start offset of the data
param
len the length of the data
exception
IOException if an I/O error has occurred

	if (def.finished()) {
	    throw new IOException("write beyond end of stream");
	}
        if ((off | len | (off + len) | (b.length - (off + len))) < 0) {
	    throw new IndexOutOfBoundsException();
	} else if (len == 0) {
	    return;
	}
	if (!def.finished()) {
            // Deflate no more than stride bytes at a time.  This avoids
            // excess copying in deflateBytes (see Deflater.c)
            int stride = buf.length;
            for (int i = 0; i < len; i+= stride) {
                def.setInput(b, off + i, Math.min(stride, len - i));
                while (!def.needsInput()) {
                    deflate();
                }
            }
	}