如何解压缩大型zip文件并在更短的时间内写入SDCARD

sac*_*003 7 iphone zip android unzip android-ndk

要解压缩zip文件,我已经使用了包java.util.zip*中的类,通过引用并且它正常工作但是解压缩40MB的文件需要59秒.当我在iPhone项目上尝试相同的zip文件时(我们正在为两个平台开发应用程序--Android和iPone以及解压缩zip文件并将解压缩的内容保存到SDCARD-Android或文档目录 - iPhone),只需14秒.iPhone应用程序使用ziparchive.

所以我的问题是:

1.从上面的实验中可以看出,与iPhone应用程序相比,Java中对SDCARD的解压缩和文件写入操作消耗的时间更长,因此我决定使用NDK进行C/C++级解压缩和文件写入操作.这是正确的选择吗?

2.我搜索了谷歌,stackoverflow和一些建议使用minizip但没有足够的帮助如何在Android中使用minizip.anyboday已经尝试过minizip for android吗?

3.我也尝试了用于libz的NDK开发来实现我的目标,因为Libz被添加到NDK但没有得到如何使用它.在NDK有人试过libz吗?

4.在Java或C/C++中是否有其他任何框架解压缩大型zip文件并在更短的时间内将它们写入SDCARD?

请帮我.

这是我的Java解压缩代码:

public String unzip() {

    String result;

    try {

        FileInputStream fin = new FileInputStream(this.filePath);
        ZipInputStream zin = new ZipInputStream(fin);
        ZipEntry ze = null;

        while ((ze = zin.getNextEntry()) != null) {

            Log.v("Unzip", "Unzipping " + ze.getName());

            if (ze.isDirectory()) {
                _dirChecker(ze.getName());
            } else {

                // Read 16 k at a time 
                byte[] buffer = new byte[16*1024];
                 int read;

                FileOutputStream fout = new FileOutputStream(this.location+ "/" + ze.getName());

                while ((read = zin.read(buffer)) != -1)
                {
                    fout.write(buffer, 0, read);
                }


                zin.closeEntry();
                fout.close();
            }

        }

        zin.close();
        result = "success";

    } catch (Exception e) {
        Log.e("unzip", "unzip", e);
        result = "failure";
    }

    return result;
}
Run Code Online (Sandbox Code Playgroud)

Zub*_*air 5

你为什么不尝试这个代码.它很棒

    String zipname = "data.zip";
FileInputStream fis = new FileInputStream(zipname);
ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis));
ZipEntry entry;

while ((entry = zis.getNextEntry()) != null) {
  System.out.println("Unzipping: " + entry.getName());

  int size;
  byte[] buffer = new byte[2048];

  FileOutputStream fos = new FileOutputStream(entry.getName());
  BufferedOutputStream bos = new BufferedOutputStream(fos, buffer.length);

  while ((size = zis.read(buffer, 0, buffer.length)) != -1) {
    bos.write(buffer, 0, size);
  }
  bos.flush();
  bos.close();
}
zis.close();
fis.close();
Run Code Online (Sandbox Code Playgroud)

}


Nic*_*sky 1

尝试将 40Mb 文件写入 SDCard 并测量所花费的时间。(几乎)所有免费(甚至付费)的 zip 存档支持库实现都基于相同的 zlib 代码,这在解压缩过程中占用了大部分处理速度。Java代码应该比本地代码慢很多,所以我建议尝试NDK解压。此外,尝试以零压缩级别解压缩存档将使您猜测解压缩代码需要多少时间以及仅数据复制花费了多少时间。