src/java.base/share/classes/java/util/zip/Deflater.java
Print this page
*** 65,80 ****
* } catch (java.util.zip.DataFormatException ex) {
* // handle
* }
* </pre></blockquote>
*
* @see Inflater
* @author David Connelly
* @since 1.1
*/
! public
! class Deflater {
private final ZStreamRef zsRef;
private byte[] buf = new byte[0];
private int off, len;
private int level, strategy;
--- 65,87 ----
* } catch (java.util.zip.DataFormatException ex) {
* // handle
* }
* </pre></blockquote>
*
+ * @apiNote
+ * To release resources used by this {@code Deflater}, the {@link #end()} method
+ * should be called explicitly. Subclasses are responsible for the cleanup of resources
+ * acquired by the subclass. Subclasses that override {@link #finalize()} in order
+ * to perform cleanup should be modified to use alternative cleanup mechanisms such
+ * as {@link java.lang.ref.Cleaner} and remove the overriding {@code finalize} method.
+ *
* @see Inflater
* @author David Connelly
* @since 1.1
*/
!
! public class Deflater {
private final ZStreamRef zsRef;
private byte[] buf = new byte[0];
private int off, len;
private int level, strategy;
*** 167,177 ****
* @param nowrap if true then use GZIP compatible compression
*/
public Deflater(int level, boolean nowrap) {
this.level = level;
this.strategy = DEFAULT_STRATEGY;
! this.zsRef = new ZStreamRef(init(level, DEFAULT_STRATEGY, nowrap));
}
/**
* Creates a new compressor using the specified compression level.
* Compressed data will be generated in ZLIB format.
--- 174,186 ----
* @param nowrap if true then use GZIP compatible compression
*/
public Deflater(int level, boolean nowrap) {
this.level = level;
this.strategy = DEFAULT_STRATEGY;
! this.zsRef = ZStreamRef.get(this,
! () -> init(level, DEFAULT_STRATEGY, nowrap),
! Deflater::end);
}
/**
* Creates a new compressor using the specified compression level.
* Compressed data will be generated in ZLIB format.
*** 532,573 ****
}
}
/**
* Closes the compressor and discards any unprocessed input.
* This method should be called when the compressor is no longer
! * being used, but will also be called automatically by the
! * finalize() method. Once this method is called, the behavior
! * of the Deflater object is undefined.
*/
public void end() {
synchronized (zsRef) {
! long addr = zsRef.address();
! zsRef.clear();
! if (addr != 0) {
! end(addr);
buf = null;
}
}
- }
/**
* Closes the compressor when garbage is collected.
*
! * @deprecated The {@code finalize} method has been deprecated.
! * Subclasses that override {@code finalize} in order to perform cleanup
! * should be modified to use alternative cleanup mechanisms and
! * to remove the overriding {@code finalize} method.
! * When overriding the {@code finalize} method, its implementation must explicitly
! * ensure that {@code super.finalize()} is invoked as described in {@link Object#finalize}.
! * See the specification for {@link Object#finalize()} for further
! * information about migration options.
! */
! @Deprecated(since="9")
! protected void finalize() {
! end();
! }
private void ensureOpen() {
assert Thread.holdsLock(zsRef);
if (zsRef.address() == 0)
throw new NullPointerException("Deflater has been closed");
--- 541,581 ----
}
}
/**
* Closes the compressor and discards any unprocessed input.
+ *
* This method should be called when the compressor is no longer
! * being used. Once this method is called, the behavior of the
! * Deflater object is undefined.
*/
public void end() {
synchronized (zsRef) {
! zsRef.clean();
buf = null;
}
}
/**
* Closes the compressor when garbage is collected.
*
! * @implSpec
! * If this {@code Deflater} has been subclassed and the {@code end} method
! * has been overridden, the {@code end} method will be called when the
! * inflater is unreachable.
! *
! * @deprecated The {@code finalize} method has been deprecated and
! * implemented as a no-op. Subclasses that override {@code finalize}
! * in order to perform cleanup should be modified to use alternative
! * cleanup mechanisms and to remove the overriding {@code finalize}
! * method. The recommended cleanup for compressor is to explicitly
! * call {@code end} method when it is no longer in use. If the
! * {@code end} is not invoked explicitly the resource of the compressor
! * will be released when the instance becomes phantom-reachable.
! */
! @Deprecated(since="9", forRemoval=true)
! protected void finalize() {}
private void ensureOpen() {
assert Thread.holdsLock(zsRef);
if (zsRef.address() == 0)
throw new NullPointerException("Deflater has been closed");