DeflaterOutputStream.java revision 2c87ad3a45cecf9e344487cad1abfdebe79f2c7c
151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* 22c87ad3a45cecf9e344487cad1abfdebe79f2c7cNarayan Kamath * Copyright (C) 2014 The Android Open Source Project 351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Copyright (c) 1996, 2009, Oracle and/or its affiliates. All rights reserved. 451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it 751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as 851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation. Oracle designates this 951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided 1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code. 1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT 1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that 1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code). 1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version 1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation, 2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any 2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions. 2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage java.util.zip; 2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.FilterOutputStream; 3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.OutputStream; 3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.InputStream; 3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.IOException; 3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/** 3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This class implements an output stream filter for compressing data in 3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the "deflate" compression format. It is also used as the basis for other 3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * types of compression filters, such as GZIPOutputStream. 3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see Deflater 4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author David Connelly 4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic 4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiclass DeflaterOutputStream extends FilterOutputStream { 4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Compressor for this stream. 4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected Deflater def; 4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Output buffer for writing compressed data. 5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected byte[] buf; 5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Indicates that the stream has been closed. 5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private boolean closed = false; 5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private final boolean syncFlush; 6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Creates a new output stream with the specified compressor, 6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * buffer size and flush mode. 6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param out the output stream 6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param def the compressor ("deflater") 6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param size the output buffer size 6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param syncFlush 7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * if {@code true} the {@link #flush()} method of this 7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * instance flushes the compressor with flush mode 7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * {@link Deflater#SYNC_FLUSH} before flushing the output 7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * stream, otherwise only flushes the output stream 7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws IllegalArgumentException if size is <= 0 7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.7 7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public DeflaterOutputStream(OutputStream out, 8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Deflater def, 8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int size, 8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski boolean syncFlush) { 8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski super(out); 8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (out == null || def == null) { 8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new NullPointerException(); 8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else if (size <= 0) { 8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new IllegalArgumentException("buffer size <= 0"); 8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.def = def; 9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.buf = new byte[size]; 9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.syncFlush = syncFlush; 9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Creates a new output stream with the specified compressor and 9751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * buffer size. 9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>The new output stream instance is created as if by invoking 10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the 4-argument constructor DeflaterOutputStream(out, def, size, false). 10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param out the output stream 10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param def the compressor ("deflater") 10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param size the output buffer size 10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception IllegalArgumentException if size is <= 0 10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public DeflaterOutputStream(OutputStream out, Deflater def, int size) { 10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this(out, def, size, false); 10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Creates a new output stream with the specified compressor, flush 11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * mode and a default buffer size. 11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param out the output stream 11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param def the compressor ("deflater") 11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param syncFlush 11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * if {@code true} the {@link #flush()} method of this 11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * instance flushes the compressor with flush mode 12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * {@link Deflater#SYNC_FLUSH} before flushing the output 12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * stream, otherwise only flushes the output stream 12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.7 12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public DeflaterOutputStream(OutputStream out, 12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Deflater def, 12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski boolean syncFlush) { 12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this(out, def, 512, syncFlush); 12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Creates a new output stream with the specified compressor and 13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * a default buffer size. 13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>The new output stream instance is created as if by invoking 13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the 3-argument constructor DeflaterOutputStream(out, def, false). 13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param out the output stream 14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param def the compressor ("deflater") 14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public DeflaterOutputStream(OutputStream out, Deflater def) { 14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this(out, def, 512, false); 14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski boolean usesDefaultDeflater = false; 14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Creates a new output stream with a default compressor, a default 15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * buffer size and the specified flush mode. 15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param out the output stream 15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param syncFlush 15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * if {@code true} the {@link #flush()} method of this 15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * instance flushes the compressor with flush mode 15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * {@link Deflater#SYNC_FLUSH} before flushing the output 15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * stream, otherwise only flushes the output stream 15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.7 16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public DeflaterOutputStream(OutputStream out, boolean syncFlush) { 16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this(out, new Deflater(), 512, syncFlush); 16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski usesDefaultDeflater = true; 16551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Creates a new output stream with a default compressor and buffer size. 16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>The new output stream instance is created as if by invoking 17151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the 2-argument constructor DeflaterOutputStream(out, false). 17251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param out the output stream 17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public DeflaterOutputStream(OutputStream out) { 17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this(out, false); 17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski usesDefaultDeflater = true; 17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Writes a byte to the compressed output stream. This method will 18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * block until the byte can be written. 18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param b the byte to be written 18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception IOException if an I/O error has occurred 18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void write(int b) throws IOException { 18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski byte[] buf = new byte[1]; 18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski buf[0] = (byte)(b & 0xff); 18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski write(buf, 0, 1); 19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Writes an array of bytes to the compressed output stream. This 19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * method will block until all the bytes are written. 19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param b the data to be written 19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param off the start offset of the data 19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param len the length of the data 19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception IOException if an I/O error has occurred 19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void write(byte[] b, int off, int len) throws IOException { 20151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (def.finished()) { 20251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new IOException("write beyond end of stream"); 20351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 20451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if ((off | len | (off + len) | (b.length - (off + len))) < 0) { 20551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new IndexOutOfBoundsException(); 20651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else if (len == 0) { 20751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return; 20851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 20951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!def.finished()) { 21051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski def.setInput(b, off, len); 21151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski while (!def.needsInput()) { 21251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski deflate(); 21351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 21451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 21551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 21651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 21751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 21851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Finishes writing compressed data to the output stream without closing 21951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the underlying stream. Use this method when applying multiple filters 22051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * in succession to the same output stream. 22151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception IOException if an I/O error has occurred 22251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 22351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void finish() throws IOException { 22451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!def.finished()) { 22551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski def.finish(); 22651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski while (!def.finished()) { 22751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski deflate(); 22851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 22951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 23051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 23151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 23251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 23351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Writes remaining compressed data to the output stream and closes the 23451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * underlying stream. 23551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception IOException if an I/O error has occurred 23651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 23751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void close() throws IOException { 23851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!closed) { 23951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski finish(); 24051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (usesDefaultDeflater) 24151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski def.end(); 24251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski out.close(); 24351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski closed = true; 24451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 24551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 24651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 24751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 24851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Writes next block of compressed data to the output stream. 24951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws IOException if an I/O error has occurred 25051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 25151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected void deflate() throws IOException { 252adbb22cb1c38fcb6160276fa2739a46b0ce516c3Przemyslaw Szczepaniak int len = 0; 253adbb22cb1c38fcb6160276fa2739a46b0ce516c3Przemyslaw Szczepaniak while ((len = def.deflate(buf, 0, buf.length)) > 0) { 254adbb22cb1c38fcb6160276fa2739a46b0ce516c3Przemyslaw Szczepaniak out.write(buf, 0, len); 25551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 25651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 25751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 25851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 25951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Flushes the compressed output stream. 26051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 26151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If {@link #DeflaterOutputStream(OutputStream, Deflater, int, boolean) 26251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * syncFlush} is {@code true} when this compressed output stream is 26351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * constructed, this method first flushes the underlying {@code compressor} 26451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * with the flush mode {@link Deflater#SYNC_FLUSH} to force 26551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * all pending data to be flushed out to the output stream and then 26651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * flushes the output stream. Otherwise this method only flushes the 26751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * output stream without flushing the {@code compressor}. 26851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 26951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws IOException if an I/O error has occurred 27051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 27151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.7 27251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 27351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void flush() throws IOException { 27451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (syncFlush && !def.finished()) { 27551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int len = 0; 27651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski while ((len = def.deflate(buf, 0, buf.length, Deflater.SYNC_FLUSH)) > 0) 27751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski { 27851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski out.write(buf, 0, len); 27951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (len < buf.length) 28051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski break; 28151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 28251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 28351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski out.flush(); 28451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 28551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 286