deflateroutputstream.java

来自「This is a resource based on j2me embedde」· Java 代码 · 共 180 行

JAVA
180
字号
/* * @(#)DeflaterOutputStream.java	1.34 06/10/10 * * Copyright  1990-2008 Sun Microsystems, Inc. All Rights Reserved.   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER   *    * This program is free software; you can redistribute it and/or   * modify it under the terms of the GNU General Public License version   * 2 only, as published by the Free Software Foundation.    *    * This program 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 version 2 for more details (a copy is   * included at /legal/license.txt).    *    * You should have received a copy of the GNU General Public License   * version 2 along with this work; if not, write to the Free Software   * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA   * 02110-1301 USA    *    * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa   * Clara, CA 95054 or visit www.sun.com if you need additional   * information or have any questions.  * */package java.util.zip;import java.io.FilterOutputStream;import java.io.OutputStream;import java.io.InputStream;import java.io.IOException;/** * 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.27, 02/02/00 * @author 	David Connelly */publicclass DeflaterOutputStream extends FilterOutputStream {    /**     * Compressor for this stream.     */    protected Deflater def;    /**     * Output buffer for writing compressed data.     */    protected byte[] buf;       /**     * Indicates that the stream has been closed.     */    private boolean closed = false;    /**     * 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     */    public DeflaterOutputStream(OutputStream out, Deflater def, int size) {        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];    }    /**     * Creates a new output stream with the specified compressor and     * a default buffer size.     * @param out the output stream     * @param def the compressor ("deflater")     */    public DeflaterOutputStream(OutputStream out, Deflater def) {	this(out, def, 512);    }    boolean usesDefaultDeflater = false;    /**     * Creates a new output stream with a defaul compressor and buffer size.     * @param out the output stream     */    public DeflaterOutputStream(OutputStream out) {	this(out, new Deflater());        usesDefaultDeflater = true;    }    /**     * 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     */    public void write(int b) throws IOException {        byte[] buf = new byte[1];	buf[0] = (byte)(b & 0xff);	write(buf, 0, 1);    }    /**     * 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     */    public void write(byte[] b, int off, int len) throws IOException {	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()) {	    def.setInput(b, off, len);	    while (!def.needsInput()) {		deflate();	    }	}    }    /**     * 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     */    public void finish() throws IOException {	if (!def.finished()) {	    def.finish();	    while (!def.finished()) {		deflate();	    }	}    }    /**     * Writes remaining compressed data to the output stream and closes the     * underlying stream.     * @exception IOException if an I/O error has occurred     */    public void close() throws IOException {        if (!closed) {            finish();            if (usesDefaultDeflater)                def.end();            out.close();            closed = true;        }    }    /**     * Writes next block of compressed data to the output stream.     * @throws IOException if an I/O error has occurred     */    protected void deflate() throws IOException {	int len = def.deflate(buf, 0, buf.length);	if (len > 0) {	    out.write(buf, 0, len);	}    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?