[ 
https://issues.apache.org/jira/browse/COMPRESS-643?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Zsolt F updated COMPRESS-643:
-----------------------------
    Description: 
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.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}
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 fully 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 for the last.xml due to the provided compressed 
size and uncompressed size. 

This issue is also reproducible in case of  iterating over the zip entries and 
read the content only for the last entry.

  was:
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.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}
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 fully 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 also reproducible in case of  iterating over the zip entries and 
read the content only for the last entry.


> 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.21, 1.23.0
>            Reporter: Zsolt F
>            Priority: Major
>             Fix For: 2.0
>
>         Attachments: test.zip
>
>
> 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.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}
> 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 fully 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 for the last.xml due to the provided compressed 
> size and uncompressed size. 
> This issue is also 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)

Reply via email to