[
https://issues.apache.org/jira/browse/COMPRESS-508?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17075862#comment-17075862
]
AD_LB edited comment on COMPRESS-508 at 4/5/20, 3:57 PM:
---------------------------------------------------------
I've noticed something weird when I tried to read from such problematic zip
files, and that's without the part of the size:
I can't do it.
It causes an exception of:
{code:java}
java.util.zip.ZipException: compressed and uncompressed size don't match while
reading a stored entry using data descriptor. Either the archive is broken or
it can not be read using ZipArchiveInputStream and you must use ZipFile. A
common cause for this is a ZIP archive containing a ZIP archive. See
http://commons.apache.org/proper/commons-compress/zip.html#ZipArchiveInputStream_vs_ZipFile
{code}
Here's the code:
{code:java}
ZipArchiveInputStream(FileInputStream(file), "UTF8", true,
true).use { inputStream ->
var entry: ArchiveEntry? = null
while (true) {
entry = inputStream.nextEntry ?: break
inputStream.copyTo(someOutputStream)
}
}
{code}
However, using the in-memory solution seems to work fine, probably because it
indeed uses ZipeFile. Meaning this:
{code:java}
ByteArrayOutputStream().use { byteArrayOutputStream ->
FileInputStream(file).copyTo(byteArrayOutputStream)
ZipFile(SeekableInMemoryByteChannel(byteArrayOutputStream.toByteArray())).use {
for (entry in it.entries) {
it.getInputStream(entry).copyTo(someOutputStream)
}
}
}
{code}
Any idea why it didn't work with the ZipArchiveInputStream ?
was (Author: androiddeveloperlb):
I've noticed something weird when I tried to read from such problematic zip
files, and that's without the part of the size:
I can't do it.
It causes an exception of:
{code:java}
java.util.zip.ZipException: compressed and uncompressed size don't match while
reading a stored entry using data descriptor. Either the archive is broken or
it can not be read using ZipArchiveInputStream and you must use ZipFile. A
common cause for this is a ZIP archive containing a ZIP archive. See
http://commons.apache.org/proper/commons-compress/zip.html#ZipArchiveInputStream_vs_ZipFile
{code}
Here's the code:
{code:java}
ZipArchiveInputStream(FileInputStream(file), "UTF8", true,
true).use { inputStream ->
var entry: ArchiveEntry? = null
while (true) {
entry = inputStream.nextEntry ?: break
inputStream.copyTo(someOutputStream)
}
}
{code}
However, using the in-memory solution seems to work fine. Meaning this:
{code:java}
ByteArrayOutputStream().use { byteArrayOutputStream ->
FileInputStream(file).copyTo(byteArrayOutputStream)
ZipFile(SeekableInMemoryByteChannel(byteArrayOutputStream.toByteArray())).use {
for (entry in it.entries) {
it.getInputStream(entry).copyTo(someOutputStream)
}
}
}
{code}
Any idea why?
> Bug: cannot get file size of ArchiveEntry using ZipArchiveInputStream
> ---------------------------------------------------------------------
>
> Key: COMPRESS-508
> URL: https://issues.apache.org/jira/browse/COMPRESS-508
> Project: Commons Compress
> Issue Type: Bug
> Components: Build
> Affects Versions: 1.20
> Environment: Android 9 and Android 10, on both emulator and real
> device .
> Reporter: AD_LB
> Priority: Major
> Attachments: 2020-03-31_20-53-36.png, 2020-04-01_18-28-19.mp4,
> ZipTest.zip, ZipTest2.zip, ZipTest3.zip, test.zip
>
>
> I'm trying to use ZipArchiveInputStream to iterate over the items of a zip
> file (which may or may not be a real file on the file-system, which is why I
> use a stream), optionally creating a stream from specific entries.
> One of the operations I need is to get the size of the files within.
> For some reason, it fails to do so. Not only that, but it throws an exception
> when I'm done with it:
> {code:java}
> Error:org.apache.commons.compress.archivers.zip.UnsupportedZipFeatureException:
> Unsupported feature data descriptor used in entry ...
> {code}
> I've attached here 3 files:sample project, the problematic zip file (remember
> that you need to put it in the correct path and grant storage permission),
> and a screenshot of the issue.
> Note that if I open the file using a third party PC app (such as
> [7-zip|https://www.7-zip.org/] ), it works fine, including showing the file
> size inside.
> Files:
> !2020-03-31_20-53-36.png![^test.zip]
> [^ZipTest.zip]
> Here's the relevant code (kotlin) :
>
> {code:java}
> thread {
> try {
> val file = File("/storage/emulated/0/test.zip")
> ZipArchiveInputStream(FileInputStream(file)).use {
> while (true) {
> val entry = it.nextEntry ?: break
> Log.d("AppLog", "entry:${entry.name} ${entry.size} ")
> }
> }
> Log.d("AppLog", "got archive ")
> } catch (e: Exception) {
> Log.d("AppLog", "Error:$e")
> e.printStackTrace()
> }
> }
> {code}
--
This message was sent by Atlassian Jira
(v8.3.4#803005)