RFR: 8313739: ZipOutputStream.close() should always close the wrapped stream
Jaikiran Pai
jpai at openjdk.org
Tue Jan 2 08:40:46 UTC 2024
On Mon, 1 Jan 2024 16:12:13 GMT, Eirik Bjørsnøs <eirbjo at openjdk.org> wrote:
> Specification: This change brings the implementation of DeflaterOutputStream.close() in line with its specification: Writes remaining compressed data to the output stream and closes the underlying stream.
> Risk: This is a behavioural change. There is a small risk that existing code depends on the close method not following its specification.
I think this won't require a CSR since the change is merely fixing an issue and making it comply with the specification.
src/java.base/share/classes/java/util/zip/DeflaterOutputStream.java line 249:
> 247: def.end();
> 248: }
> 249: out.close();
This call has a potential to throw an `IOException` in which case any original `IOException` thrown from the `finish()` call will be lost.
Perhaps we should do something like:
public void close() throws IOException {
if (!closed) {
IOException finishFailure = null;
try {
finish();
} catch (IOException ioe){
finishFailure = ioe;
} finally {
if (usesDefaultDeflater) {
def.end();
}
try {
out.close();
} catch (IOException ioe) {
if (finishFailure != null) {
ioe.addSuppressed(finishFailure);
}
throw ioe;
}
closed = true;
}
}
}
-------------
PR Comment: https://git.openjdk.org/jdk/pull/17209#issuecomment-1873737464
PR Review Comment: https://git.openjdk.org/jdk/pull/17209#discussion_r1439238691
More information about the core-libs-dev
mailing list