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'文件夹中,我很确定从这个目录中读取的唯一方法是通过流式传输.
有没有办法让我做到这一点?
谢谢你的回答.我最终使用: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,但它需要传入一个字符串,但我不确定该目录的路径是什么或如何获取它?
使用ZipFileAPI,有一种size方法,它返回的数量ZipEntries在ZipFile。您可以从资产文件夹中读取。
例子:
int zipEntriesCount(String path) throws IOException {
ZipFile zf= new ZipFile(path);
return zf.size();
}
Run Code Online (Sandbox Code Playgroud)
您的基本问题似乎是您必须progressBar.setMax()在开始读取文件之前执行此操作,并且您正在根据文件数量设置最大值。
您是否考虑过progressBar.setMax(zin.getSize())在调用 时记录并跟踪已写入的字节数progressBar.setProgress(),而不是已读取的文件数?这应该可以解决您的问题,并为您提供(恕我直言)更准确的进度条。
| 归档时间: |
|
| 查看次数: |
5728 次 |
| 最近记录: |