Android:获取Zip文件数量?

我有一个似乎很容易的问题,但我似乎无法得到它正常工作。

我在我的“资产”文件夹中有一个zip文件,我需要解压缩,并且我有一个ProgessBar ,我想在其中向用户显示进度如何。

我有一切工作,但我想将ProgessBar最大值设置为zip文件中的文件数。 这个文件夹中的文件数量有时会改变,所以我希望ProgessBar是相对于zip文件中包含多less个文件的。

我正在使用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); } 

这工作,但有两个while循环似乎有点多余,基本上是做同样的事情。

我知道有一个ZipFile -API,它有一个size()方法,但它需要一个文件path,因为我的文件位于“assets”文件夹中,所以我很确定从这个目录读取的唯一方法是通过stream式传输。

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

Solutions Collecting From Web of "Android:获取Zip文件数量?"

感谢您的答案。 我最终使用: AssetFileDescriptor API来获取zip文件的文件大小,并将其设置为ProgessBar.setMax()值。 然后,当我通过zip内容循环时,我使用每个条目文件大小来增加进度。 这是有效的,但我唯一担心的是, AssetFileDescriptor.getLength()值以及ZipEntry.getSize()值返回一个long整型值,所以我不得不把它们转换为一个整数,然后才能设置最大值和/或递增ProgessBar所以有一点可能性,我可能会重载一个整数值导致一个exception,但这是不可能的,因为我不认为我的文件大小比一个整数的最大容量更大。

 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.. } 

不是最好的解决scheme,但它的作品。

我知道的ZipFile API,但它需要一个string被传入,但我不知道什么path是该目录或如何得到它?

使用ZipFile API,有一个size方法,返回ZipFile ZipEntries的数量。 您可以从资产文件夹中读取。

例:

 int zipEntriesCount(String path) throws IOException { ZipFile zf= new ZipFile(path); return zf.size(); } 

您的基本问题似乎是,您必须先执行progressBar.setMax()然后再开始读取文件,然后根据文件数量设置最大值。

你有没有想过要进行progressBar.setMax(zin.getSize()) ,然后跟踪你调用progressBar.setProgress()时写的字节数,而不是你读过多less个文件? 这应该解决你的问题,并会给你(imho)一个更准确的进度条。