--- old/src/share/classes/java/util/zip/DeflaterOutputStream.java Wed Oct 21 10:44:53 2009 +++ new/src/share/classes/java/util/zip/DeflaterOutputStream.java Wed Oct 21 10:44:52 2009 @@ -1,5 +1,5 @@ /* - * Copyright 1996-2006 Sun Microsystems, Inc. All Rights Reserved. + * 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 @@ -56,15 +56,29 @@ private boolean closed = false; + private final boolean syncFlush; + /** - * Creates a new output stream with the specified compressor and - * buffer size. + * 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 - * @exception IllegalArgumentException if size is <= 0 + * @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) { + public DeflaterOutputStream(OutputStream out, + Deflater def, + int size, + boolean syncFlush) { super(out); if (out == null || def == null) { throw new NullPointerException(); @@ -72,27 +86,93 @@ throw new IllegalArgumentException("buffer size <= 0"); } this.def = def; - buf = new byte[size]; + this.buf = new byte[size]; + this.syncFlush = syncFlush; } + /** * Creates a new output stream with the specified compressor and + * buffer size. + * + *

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. + * + *

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); + 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. + * + *

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, new Deflater()); + this(out, false); usesDefaultDeflater = true; } @@ -178,4 +258,32 @@ 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(); + } }