src/java.base/share/classes/java/util/zip/Deflater.java
Print this page
@@ -167,11 +167,13 @@
* @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));
+ this.zsRef = new ZStreamRef(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,42 +534,36 @@
}
}
/**
* 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.
+ * being used. 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);
+ zsRef.clean();
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();
- }
+ * @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");