--- a/jdk/src/share/classes/java/util/zip/DeflaterOutputStream.java Wed Oct 21 11:40:40 2009 -0700
+++ b/jdk/src/share/classes/java/util/zip/DeflaterOutputStream.java Wed Oct 21 11:50:25 2009 -0700
@@ -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.
+ *
+ * <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);
+ 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, 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();
+ }
}