Zsolt F created COMPRESS-643:
--------------------------------
Summary: ZipArchiveInputStream.getCompressedCount is not
calculated properly
Key: COMPRESS-643
URL: https://issues.apache.org/jira/browse/COMPRESS-643
Project: Commons Compress
Issue Type: Bug
Components: Compressors
Affects Versions: 1.23.0, 1.21
Reporter: Zsolt F
Fix For: 2.0
Attachments: test.zip
{code:java}
// code placeholder
{code}
h2. Context
During iterating over the zip entries by using ZipArchiveInputStream the
provided
getCompressedCount and getUncompressedCount methods do not return the correct
values when the stream content is not fully read.
h2. Demo
The zip file used in the code snippets attached to the jira.
*Good behaviour*
Executing the follow code working as expected:
{code:java}
final ZipArchiveInputStream stream = new ZipArchiveInputStream(new
FileInputStream("test.zip"));
while (true)
{
final ZipArchiveEntry nextZipEntry = stream.getNextZipEntry();
if (null == nextZipEntry)
{
break;
}
//reading all the content
stream.readAllBytes();
System.out.println(String.format("[%s] compressed size: [%d] uncompressed
size: [%d], calculated ratio: [%.2f]",
nextZipEntry.getName(),
stream.getCompressedCount(),
stream.getUncompressedCount(),
(double) stream.getCompressedCount() /
stream.getUncompressedCount()));
} {code}
Procced output:
{code:java}
[first.xml] compressed size: [475830] uncompressed size: [16239665], calculated
ratio: [0.03]
[last.xml] compressed size: [2221] uncompressed size: [45481], calculated
ratio: [0.05] {code}
*Bad behaviour*
The next code snippet doesn't read the second entry fully only 16 bytes, and in
this case the calculated values are wrong.
{code:java}
final ZipArchiveInputStream stream = new ZipArchiveInputStream(new
FileInputStream("test.zip"));
while (true)
{
final ZipArchiveEntry nextZipEntry = stream.getNextZipEntry();
if (null == nextZipEntry)
{
break;
}
//reading only the last entry
if ("first.xml".equals(nextZipEntry.getName()))
{
stream.readAllBytes();
}
else
{
stream.readNBytes(16);
}
System.out.println(String.format("[%s] compressed size: [%d] uncompressed
size: [%d], calculated ratio: [%.2f]",
nextZipEntry.getName(),
stream.getCompressedCount(),
stream.getUncompressedCount(),
(double) stream.getCompressedCount() /
stream.getUncompressedCount()));
} {code}
Output:
{code:java}
[first.xml] compressed size: [475830] uncompressed size: [16239665], calculated
ratio: [0.03]
[last.xml] compressed size: [81] uncompressed size: [16], calculated ratio:
[5.06] {code}
The calculated ratio is wrong the last.xml due to the compressed size and
uncompressed size is wrong.
This issue is reproducible in case of iterating over the zip entries and read
the content only for the last entry.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)