[
https://issues.apache.org/jira/browse/COMPRESS-486?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16838038#comment-16838038
]
Stefan Bodewig commented on COMPRESS-486:
-----------------------------------------
The reason here is the {{ZipFile}} instance gets created in the {{expand}}
overload that expects a {{SeekableByteChannel}} and we explicitly don't close
the {{ZipFile}} as this would close the channel which - in general - is not
owned by {{Expander}}.
This is easily solved for the case where the channel-arg expand is called from
one of the {{File}}-arg versions but not in the general case.
> Expander causes "Cleaning up unclosed ZipFile" to be written to stderr
> ----------------------------------------------------------------------
>
> Key: COMPRESS-486
> URL: https://issues.apache.org/jira/browse/COMPRESS-486
> Project: Commons Compress
> Issue Type: Bug
> Affects Versions: 1.18
> Environment: Java 1.8, Windows 10, IntelliJ 2018.2.7
> Reporter: Jordan Piscitelli
> Priority: Minor
>
> Using the Expander, I found that it will create a zip file that is not closed
> which results in an error message being written to std-err when garbage
> collection (and finalization) occurs.
> I believe it is [line 140 of the
> Expander|https://github.com/apache/commons-compress/blob/master/src/main/java/org/apache/commons/compress/archivers/examples/Expander.java#L140]
> as it creates a zip file that does not appear to be closed.
> {code:java}
> 140: expand(new ZipFile(archive), targetDirectory);{code}
> I have created a test that demonstrates the behavior. It runs
> Expander.expand(file, file) followed by garbage collection and finalize, and
> passes if stderr was not written to.
> Currently the test fails as "Cleaning up unclosed ZipFile for archive unknown
> archive" is written to stderr.
> {code:java}
> import java.io.ByteArrayOutputStream;
> import java.io.File;
> import java.io.FileOutputStream;
> import java.io.IOException;
> import java.io.OutputStream;
> import java.io.PrintStream;
> import java.nio.charset.StandardCharsets;
> import org.apache.commons.compress.archivers.ArchiveException;
> import org.apache.commons.compress.archivers.ArchiveOutputStream;
> import org.apache.commons.compress.archivers.ArchiveStreamFactory;
> import org.apache.commons.compress.archivers.examples.Expander;
> import org.codehaus.plexus.util.StringUtils;
> import org.junit.jupiter.api.Test;
> import org.springframework.util.Assert;
> public class ExpanderCloseTest {
> @Test
> public void testExpanderClosesZipFile() {
> final ByteArrayOutputStream errOutputStream = new
> ByteArrayOutputStream();
> try {
> final File sourceArchiveFile = createSampleZip();
> final File targetExpansionDirectory =
> File.createTempFile("dest.zip", null);
> try (PrintStream ps = new PrintStream(errOutputStream, true,
> "UTF-8")) {
> System.setErr(ps);
> Expander expander = new Expander();
> expander.expand(sourceArchiveFile, targetExpansionDirectory);
> System.gc();
> System.runFinalization();
> }
> } catch (Exception e) {
> throw new RuntimeException(e);
> }
> String stderr = new String(errOutputStream.toByteArray(),
> StandardCharsets.UTF_8);
> Assert.isTrue(StringUtils.isBlank(stderr), "Nothing should have been
> written to stderr, but this was: " + stderr);
> }
> private File createSampleZip() throws IOException, ArchiveException {
> final File sourceArchiveFile = File.createTempFile("example.zip",
> null);
> OutputStream archiveStream = new FileOutputStream(sourceArchiveFile);
> ArchiveOutputStream archive = new
> ArchiveStreamFactory().createArchiveOutputStream(ArchiveStreamFactory.ZIP,
> archiveStream);
> archive.finish();
> archiveStream.close();
> return sourceArchiveFile;
> }
> }
> {code}
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)