[ 
https://issues.apache.org/jira/browse/COMPRESS-508?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17073115#comment-17073115
 ] 

AD_LB edited comment on COMPRESS-508 at 4/1/20, 8:29 PM:
---------------------------------------------------------

OK how can I make the ZipArchiveInputStream skip to the important part then, to 
get information about all entries?

There are multiple reasons for why I ask about InputStream :
 # Android is becoming more restricted about File and file path, as Google 
pushes to use SAF API. This means I might need to use Uri (which can produce an 
InputStream whenever I wish) of file (or any other content source).
 # According to Google, InputStream is the recommended way to handle content, 
and that libraries of all types should have prefered it anyway, instead of a 
limited file-path (because you can, for example, read from the Internet or from 
another app, and InputStream is the only one that is common between them).

Assuming you have the ability to create the InputStream of the file whenever 
you wish (and the file doesn't change, of course), you should be able to reach 
all of its data however you wish. This means that it doesn't technically matter 
if you use ZipFile or ZipArchiveInputStream  - both should be able to get the 
entries sizes. 

How can I use ZipArchiveInputStream  and still get the important data? I could 
create my own collection of entries-like classes, that include the names and 
sizes.

I could create 2 (or more) InputStream if you wish, of the same file.

And theoratically, I could give you a certain amount of RAM, so that you could 
store the entire file into it (unless too large).

In any case, what I say is that no matter which way you use to get the bytes, 
it's still the same bytes. It should be possible to get to any byte you need, 
and if I tell you that I can create the InputStream whenever you wish, you 
should be able to read anything you want from it.


was (Author: androiddeveloperlb):
OK how can I make the ZipArchiveInputStream skip to the important part then, to 
get information about all entries?

There are multiple reasons for why I ask about InputStream :
 # Android is becoming more restricted about File and file path, as Google 
pushes to use SAF API. This means I might need to use Uri (which can produce an 
InputStream whenever I wish) of file (or any other content source).
 # According to Google, InputStream is the recommended way to handle content, 
and that libraries of all types should have prefered it anyway, instead of a 
limited file-path (because you can, for example, read from the Internet or from 
another app, and InputStream is the only one that is common between them).

Assuming you have the ability to create the InputStream of the file whenever 
you wish (and the file doesn't change, of course), you should be able to reach 
all of its data however you wish. This means that it doesn't technically matter 
if you use ZipFile or ZipArchiveInputStream  - both should be able to get the 
entries sizes. 

How can I use ZipArchiveInputStream  and still get the important data? I could 
create my own collection of entries-like classes, that include the names and 
sizes.

I could create 2 (or more) InputStream if you wish, of the same file.

> 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, 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)

Reply via email to