Android:获取Zip中的文件数量?

Jac*_*ack 9 java zip android android-assets

我有一个看似简单的问题,但我似乎无法让它正常工作.

我的'assets'文件夹中有一个zip文件,我需要解压缩ProgessBar,我想在其中向用户显示进度如何.

我有一切工作,但我想将ProgessBar最大值设置为zip文件中的文件数.此文件夹中的文件数有时会发生变化,因此我希望ProgessBar相对于zip中包含的文件数量.

我正在使用ZipInputStream-API,但似乎没有办法获取zip文件中的文件数量.我能想到的唯一方法是这样做:

   ZipInputStream zin = new ZipInputStream(getAssets().open(
                                "myFile.zip"));
   int numFiles = 0;
   int increment = 0;
   while (zin.getNextEntry() != null) {
     numFiles++;
    }

    ZipEntry ze = null;
    //Set the Max..value here..
    progessBar.setMax(numFiles);                
    while ((ze = zin.getNextEntry()) != null) {
       increment++;
       progessBar.setProgress(increment);
    }
Run Code Online (Sandbox Code Playgroud)

这有效,但有两个while循环似乎有点多余,基本上做同样的事情.

我知道有一个ZipFile-API有一个size()-method,但它需要一个文件的路径,因为我的文件位于'assets'文件夹中,我很确定从这个目录中读取的唯一方法是通过流式传输.

有没有办法让我做到这一点?

Jac*_*ack 8

谢谢你的回答.我最终使用:AssetFileDescriptorAPI来获取zip文件的文件大小并将其设置为ProgessBar.setMax()值.然后,当我遍历zip内容时,我通过使用每个条目文件大小来增加进度.这是有效的,但我唯一担心的是AssetFileDescriptor.getLength()值和ZipEntry.getSize()值都返回一个long值所以我被迫将它们转换为一个整数,然后才能设置最大值和/或增量值,ProgessBar所以我可能会超载导致异常的整数值,但这不太可能,因为我预计我的文件大小不会超过整数的最大保持容量.

ZipInputStream zin = new ZipInputStream(getAssets().open(
                            "myFile.zip"));
ZipEntry ze = null;
AssetFileDescriptor mydisc = getAssets().openFd("myFile.zip");
//Size of the zip package
long size = mydisc.getLength();
long increment = 0;
dialog.setMax((int) size);
while ((ze = zin.getNextEntry()) != null) {
     increment += (int) ze.getSize();
     progessBar.setProgess((int)increment);
     //do more stuff..
}
Run Code Online (Sandbox Code Playgroud)

不是最好的解决方案,但它有效.

我知道ZipFileAPI,但它需要传入一个字符串,但我不确定该目录的路径是什么或如何获取它?


Can*_*ner 5

使用ZipFileAPI,有一种size方法,它返回的数量ZipEntriesZipFile。您可以从资产文件夹中读取。

例子:

int zipEntriesCount(String path) throws IOException {

     ZipFile zf= new ZipFile(path);
     return zf.size();
}
Run Code Online (Sandbox Code Playgroud)


dav*_*orb 4

您的基本问题似乎是您必须progressBar.setMax()在开始读取文件之前执行此操作,并且您正在根据文件数量设置最大值。

您是否考虑过progressBar.setMax(zin.getSize())在调用 时记录并跟踪已写入的字节数progressBar.setProgress(),而不是已读取的文件数?这应该可以解决您的问题,并为您提供(恕我直言)更准确的进度条。

  • 不起作用,因为 ZipInputStream 没有任何名为 getSize 的方法。 (4认同)