Android:获取 Zip 中的文件数量?
我有一个看起来很简单的问题,但我似乎无法让它正常工作。
我的“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);
}
这可行,但有两个 while 循环似乎有点多余,它们基本上做同样的事情。
我知道有一个 ZipFile
-API 具有 size()
-方法,但它需要文件的路径,因为我的文件位于“assets”中' 文件夹我很确定从该目录读取的唯一方法是通过流式传输。
我有办法实现这个目标吗?
I have a question that seems easy but I cannot seem to get it to work properly.
I have a zip file within my 'assets' folder that I need to unzip and I have a ProgessBar
in which I want to display to the user how the progress is going.
I have everything working but I want to set the ProgessBar
max value to be the number of files within the zip file. The number of files within this folder will sometimes change so I want the ProgessBar
to be relative to how many files are contained within the zip.
I'm using the ZipInputStream
-API but does not seem there is a way to get the number of files within the zip file. The only way I can of think of is doing this:
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);
}
This works but having two while loops seems a bit redundant which are basically doing the same thing.
I know that there is a ZipFile
-API which has a size()
-method, but it requires a path to the file and since my file is located within the 'assets' folder I am pretty sure the only way to read from this directory is by streaming.
Is there a way for me to accomplish this?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
感谢您的回答。我最终使用:AssetFileDescriptor API 来获取 zip 文件的文件大小并将其设置为 ProgessBar.setMax() 值。然后,当我循环遍历 zip 内容时,我通过使用每个条目的文件大小来增加进度。这有效,但我唯一担心的是
AssetFileDescriptor.getLength()
值以及ZipEntry.getSize()
值返回一个long
值,因此在设置最大值和/或增加 ProgessBar 之前,我被迫将它们转换为整数,因此我有可能会重载整数值,从而导致异常,但这不是可能是因为我没有预料到我的文件大小变得大于整数的最大容纳容量。不是最好的解决方案,但它有效。
我知道 ZipFile API,但它需要传入一个字符串,但我不确定该目录的路径是什么或如何获取它?
Thanks for the answers. What I ended up doing using the:
AssetFileDescriptor
API to get the file size of the zip file and setting that as theProgessBar.setMax()
value. Then as I loop through the zip contents I increment the progress by using each entries file size. This works but the only concern I have is that theAssetFileDescriptor.getLength()
value as well as theZipEntry.getSize()
values return along
value so I am forced to cast them to an integer before I can set the max and/or increment theProgessBar
so there is a slight possibility I might overload an integer value causing an exception but this is not likely because I do not anticipate my file sizes ever getting bigger than the max holding capacity of an integer.Not the best solution but it works.
I'm aware of the
ZipFile
API but it requires a string to be passed in but I am not sure what the path is to that directory or how to get it?使用
ZipFile
API,有一个size
方法返回ZipFile
中ZipEntries
的数量。您可以从资产文件夹中读取。例子:
Use
ZipFile
API, There is asize
method that returns the number ofZipEntries
in theZipFile
. You can read from assets folder.example:
您的基本问题似乎是您必须在开始读取文件之前执行
progressBar.setMax()
,并且您要根据文件数量设置最大值。您是否考虑过执行
progressBar.setMax(zin.getSize())
,然后在调用progressBar.setProgress()
时跟踪已写入的字节数,而不是你读过多少个文件?这应该可以解决您的问题,并为您提供(恕我直言)更准确的进度条。Your basic problem seems to be that you have to do
progressBar.setMax()
before you start reading the file, and you are setting the max based on the number of files.Have you thought about doing
progressBar.setMax(zin.getSize())
and then keeping track of how many bytes you've written when you callprogressBar.setProgress()
, instead of how many files you've read? This should solve your problem and will give you (imho) a more accurate progress bar.这是我基于@davorb想法的解决方案,它是根据文件大小而不是zip文件的内容显示进度。
使用示例:
this is my solution based on @davorb idea which is to show progress based on file size and not content of zip file.
Example of using it :
对于 lingala.zip4j Zip4j
for lingala.zip4j Zip4j