src/share/classes/java/util/zip/DeflaterOutputStream.java

Print this page

        

*** 1,7 **** /* ! * Copyright 1996-2006 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code 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. Sun designates this --- 1,7 ---- /* ! * Copyright 1996-2009 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code 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. Sun designates this
*** 54,100 **** * 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 default 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 --- 54,180 ---- * Indicates that the stream has been closed. */ private boolean closed = false; + private final boolean syncFlush; + /** ! * Creates a new output stream with the specified compressor, ! * buffer size and flush mode. ! * @param out the output stream * @param def the compressor ("deflater") * @param size the output buffer size ! * @param syncFlush ! * if {@code true} the {@link flush()} method of this ! * instance flushes the compressor with flush mode ! * {@link Deflater#SYNC_FLUSH} before flushing the output ! * stream, otherwise only flushes the output stream ! * ! * @throws IllegalArgumentException if size is <= 0 ! * ! * @since 1.7 */ ! public DeflaterOutputStream(OutputStream out, ! Deflater def, ! int size, ! boolean syncFlush) { super(out); if (out == null || def == null) { throw new NullPointerException(); } else if (size <= 0) { throw new IllegalArgumentException("buffer size <= 0"); } this.def = def; ! this.buf = new byte[size]; ! this.syncFlush = syncFlush; } + /** * Creates a new output stream with the specified compressor and + * buffer size. + * + * <p>The new output stream instance is created as if by invoking + * the 4-argument constructor DeflaterOutputStream(out, def, size, false). + * + * @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) { + this(out, def, size, false); + } + + /** + * Creates a new output stream with the specified compressor, flush + * mode and a default buffer size. + * + * @param out the output stream + * @param def the compressor ("deflater") + * @param syncFlush + * if {@code true} the {@link flush()} method of this + * instance flushes the compressor with flush mode + * {@link Deflater#SYNC_FLUSH} before flushing the output + * stream, otherwise only flushes the output stream + * + * @since 1.7 + */ + public DeflaterOutputStream(OutputStream out, + Deflater def, + boolean syncFlush) { + this(out, def, 512, syncFlush); + } + + + /** + * Creates a new output stream with the specified compressor and * a default buffer size. + * + * <p>The new output stream instance is created as if by invoking + * the 3-argument constructor DeflaterOutputStream(out, def, false). + * * @param out the output stream * @param def the compressor ("deflater") */ public DeflaterOutputStream(OutputStream out, Deflater def) { ! this(out, def, 512, false); } boolean usesDefaultDeflater = false; + /** + * Creates a new output stream with a default compressor, a default + * buffer size and the specified flush mode. + * + * @param out the output stream + * @param syncFlush + * if {@code true} the {@link flush()} method of this + * instance flushes the compressor with flush mode + * {@link Deflater#SYNC_FLUSH} before flushing the output + * stream, otherwise only flushes the output stream + * + * @since 1.7 + */ + public DeflaterOutputStream(OutputStream out, boolean syncFlush) { + this(out, new Deflater(), 512, syncFlush); + usesDefaultDeflater = true; + } + + /** * Creates a new output stream with a default compressor and buffer size. + * + * <p>The new output stream instance is created as if by invoking + * the 2-argument constructor DeflaterOutputStream(out, false). + * * @param out the output stream */ public DeflaterOutputStream(OutputStream out) { ! this(out, false); usesDefaultDeflater = true; } /** * Writes a byte to the compressed output stream. This method will
*** 176,181 **** --- 256,289 ---- int len = def.deflate(buf, 0, buf.length); if (len > 0) { out.write(buf, 0, len); } } + + /** + * Flushes the compressed output stream. + * + * If {@link DeflaterOutputStream(OutputStream, Deflater, int, boolean) + * syncFlush} is {@code true} when this compressed output stream is + * constructed this method flushes the underlying {@code compressor} + * first with the flush mode {@link Deflater#SYNC_FLUSH} to force + * all pending data to be flushed out to the output stream and then + * flushes the output stream. Otherwise this method only flushes the + * output stream without flushing the {@code compressor}. + * + * @throws IOException if an I/O error has occurred + * + * @since 1.7 + */ + public void flush() throws IOException { + if (syncFlush && !def.finished()) { + int len = 0; + while ((len = def.deflate(buf, 0, buf.length, Deflater.SYNC_FLUSH)) > 0) + { + out.write(buf, 0, len); + if (len < buf.length) + break; + } + } + out.flush(); + } }