13

我正在使用 : 从位于我的 Android 资产文件夹中的 ZIP 文件中读取文件ZipInputStream:它可以工作,但它真的很慢,因为它必须使用顺序读取它getNextEntry(),并且有很多文件。

如果我将ZIP文件复制到SD卡上,使用时读取速度确实很快ZipFile.getEntry,但是我没有找到ZipFile与资产文件一起使用的方法!

有什么方法可以快速访问资产文件夹中的 ZIP?还是我真的必须将 ZIP 复制到 SD 卡?

(顺便说一句,如果有人想知道我为什么这样做:该应用程序大于 50 MB,所以为了在 Play 商店中获得它,我必须使用扩展 APK;但是,因为这个应用程序也应该放入Amazon App Store,我必须为此使用另一个版本,因为 Amazon 不支持扩展 APK,自然......我认为在两个不同的位置访问 ZIP 文件将是处理这个问题的简单方法,但是唉...... .)

4

3 回答 3

4

这对我有用:

private void loadzip(String folder, InputStream inputStream) throws IOException
{
    ZipInputStream zipIs = new ZipInputStream(inputStream); 
    ZipEntry ze = null;

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

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

                byte[] buffer = new byte[1024];
                int length = 0;

                while ((length = zipIs.read(buffer))>0) {
                fout.write(buffer, 0, length);
                }
                zipIs.closeEntry();
                fout.close();
            }
            zipIs.close();
}
于 2014-07-01T10:23:49.150 回答
2

您可以将未压缩的文件直接存储在 assets 中(即将 zip 解压到 assets/ 文件夹中)。这样,您可以直接访问这些文件,并且在您构建 APK 时无论如何它们都会被压缩。

于 2014-04-11T07:27:26.537 回答
1

You can create a ZipInputStream in the following way :

ZipInputStream zipIs = new ZipInputStream(context.getResources().openRawResource(your.package.com.R.raw.filename)); 
ZipEntry ze = null;

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

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

            byte[] buffer = new byte[1024];
            int length = 0;

            while ((length = zipIs.read(buffer))>0) {
            fout.write(buffer, 0, length);
            }
            zipIs .closeEntry();
            fout.close();
        }
        zipIs .close();
于 2012-07-23T15:00:44.953 回答