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

Print this page

        

*** 120,129 **** --- 120,156 ---- /** * Default compression strategy. */ public static final int DEFAULT_STRATEGY = 0; + /** + * Compression flush mode used to achieve best compression result. + * + * @see Deflater#deflate(byte[], int, int, int) + * @since 1.7 + */ + public static final int NO_FLUSH = 0; + + /** + * Compression flush mode used to flush out all pending output; may + * degrade compression for some compression algorithms. + * + * @see Deflater#deflate(byte[], int, int, int) + * @since 1.7 + */ + public static final int SYNC_FLUSH = 2; + + /** + * Compression flush mode used to flush out all pending output and + * reset the deflater. Using this mode too often can seriously degrade + * compression. + * + * @see Deflater#deflate(byte[], int, int, int) + * @since 1.7 + */ + public static final int FULL_FLUSH = 3; + static { /* Zip library is loaded from System.initializeSystemClass */ initIDs(); }
*** 287,328 **** public synchronized boolean finished() { return finished; } /** ! * Fills specified buffer with compressed data. Returns actual number ! * of bytes of compressed data. A return value of 0 indicates that ! * needsInput() should be called in order to determine if more input ! * data is required. * @param b the buffer for the compressed data * @param off the start offset of the data * @param len the maximum number of bytes of compressed data ! * @return the actual number of bytes of compressed data */ ! public synchronized int deflate(byte[] b, int off, int len) { ! if (b == null) { ! throw new NullPointerException(); } - if (off < 0 || len < 0 || off > b.length - len) { - throw new ArrayIndexOutOfBoundsException(); - } - return deflateBytes(b, off, len); - } /** ! * Fills specified buffer with compressed data. Returns actual number ! * of bytes of compressed data. A return value of 0 indicates that ! * needsInput() should be called in order to determine if more input ! * data is required. * @param b the buffer for the compressed data ! * @return the actual number of bytes of compressed data */ public int deflate(byte[] b) { ! return deflate(b, 0, b.length); } /** * Returns the ADLER-32 value of the uncompressed data. * @return the ADLER-32 value of the uncompressed data */ public synchronized int getAdler() { ensureOpen(); --- 314,420 ---- public synchronized boolean finished() { return finished; } /** ! * Compresses the input data and fills specified buffer with compressed ! * data. Returns actual number of bytes of compressed data. A return value ! * of 0 indicates that {@link needsInput() needsInput} should be called ! * in order to determine if more input data is required. ! * ! * <p>This method uses {@link #NO_FLUSH} as its compression flush mode. ! * An invocation of this method of the form {@code deflater.deflate(b, off, len)} ! * yields the same result as the invocation of ! * {@code deflater.deflate(b, off, len, Deflater.NO_FLUSH)}. ! * * @param b the buffer for the compressed data * @param off the start offset of the data * @param len the maximum number of bytes of compressed data ! * @return the actual number of bytes of compressed data written to the ! * output buffer */ ! public int deflate(byte[] b, int off, int len) { ! return deflateBytes(b, off, len, NO_FLUSH); } /** ! * Compresses the input data and fills specified buffer with compressed ! * data. Returns actual number of bytes of compressed data. A return value ! * of 0 indicates that {@link needsInput() needsInput} should be called ! * in order to determine if more input data is required. ! * ! * <p>This method uses {@link #NO_FLUSH} as its compression flush mode. ! * An invocation of this method of the form {@code deflater.deflate(b)} ! * yields the same result as the invocation of ! * {@code deflater.deflate(b, 0, b.length, Deflater.NO_FLUSH)}. ! * * @param b the buffer for the compressed data ! * @return the actual number of bytes of compressed data written to the ! * output buffer */ public int deflate(byte[] b) { ! return deflate(b, 0, b.length, NO_FLUSH); } /** + * Compresses the input data and fills the specified buffer with compressed + * data. Returns actual number of bytes of data compressed. + * + * <p>Compression flush mode is one of the following three modes: + * + * <ul> + * <li>{@link #NO_FLUSH}: allows the deflater to decide how much data + * to accumulate, before producing output, in order to achieve the best + * compression (should be used in normal use scenario). A return value + * of 0 in this flush mode indicates that {@link #needsInput()} should + * be called in order to determine if more input data is required. + * + * <li>{@link #SYNC_FLUSH}: all pending output in the deflater is flushed, + * to the specified output buffer, so that an inflater that works on + * compressed data can get all input data available so far (In particular + * the {@link #needsInput()} returns {@code true} after this invocation + * if enough output space is provided). Flushing with {@link #SYNC_FLUSH} + * may degrade compression for some compression algorithms and so it + * should be used only when necessary. + * + * <li>{@link #FULL_FLUSH}: all pending output is flushed out as with + * {@link #SYNC_FLUSH}. The compression state is reset so that the inflater + * that works on the compressed output data can restart from this point + * if previous compressed data has been damaged or if random access is + * desired. Using {@link #FULL_FLUSH} too often can seriously degrade + * compression. + * </ul> + * + * <p>In the case of {@link #FULL_FLUSH} or {@link #SYNC_FLUSH}, if + * the return value is {@code len}, the space available in output + * buffer {@code b}, this method should be invoked again with the same + * {@code flush} parameter and more output space. + * + * @param b the buffer for the compressed data + * @param off the start offset of the data + * @param len the maximum number of bytes of compressed data + * @param flush the compression flush mode + * @return the actual number of bytes of compressed data written to + * the output buffer + * + * @throws IllegalArgumentException if the flush mode is invalid + * @since 1.7 + */ + public synchronized int deflate(byte[] b, int off, int len, int flush) { + if (b == null) { + throw new NullPointerException(); + } + if (off < 0 || len < 0 || off > b.length - len) { + throw new ArrayIndexOutOfBoundsException(); + } + if (flush == NO_FLUSH || flush == SYNC_FLUSH || + flush == FULL_FLUSH) + return deflateBytes(b, off, len, flush); + throw new IllegalArgumentException(); + } + + /** * Returns the ADLER-32 value of the uncompressed data. * @return the ADLER-32 value of the uncompressed data */ public synchronized int getAdler() { ensureOpen();
*** 418,428 **** private static native void initIDs(); private native static long init(int level, int strategy, boolean nowrap); private native static void setDictionary(long strm, byte[] b, int off, int len); ! private native int deflateBytes(byte[] b, int off, int len); private native static int getAdler(long strm); private native static long getBytesRead(long strm); private native static long getBytesWritten(long strm); private native static void reset(long strm); private native static void end(long strm); --- 510,520 ---- private static native void initIDs(); private native static long init(int level, int strategy, boolean nowrap); private native static void setDictionary(long strm, byte[] b, int off, int len); ! private native int deflateBytes(byte[] b, int off, int len, int flush); private native static int getAdler(long strm); private native static long getBytesRead(long strm); private native static long getBytesWritten(long strm); private native static void reset(long strm); private native static void end(long strm);