Подтвердить что ты не робот

Чтение файлов из ZIP файла в папке с вашими Android файлами

Я читаю файлы из ZIP файла, расположенного в моей папке с файлами Android, используя ZipInputStream: он работает, но он очень медленный, так как он должен читать его последовательно с помощью getNextEntry(), и есть довольно много файлов.

Если я копирую ZIP файл на SD-карту, чтение выполняется очень быстро при использовании ZipFile.getEntry, но я не нашел способ использовать ZipFile с файлом активов!

Есть ли способ получить доступ к ZIP в папке с активами скорейшим образом? Или мне действительно нужно скопировать ZIP на SD-карту?

(BTW, если кто-нибудь задается вопросом, почему я это делаю: приложение больше 50 МБ, поэтому, чтобы получить его в Play Store, я должен использовать APK расширения, однако, поскольку это приложение также должно быть В Amazon App Store я должен использовать другую версию, так как Amazon не поддерживает расширения APK, естественно... Я думал, что доступ к ZIP файлу в двух разных местах будет простым способом справиться с этим, но увы...)

4b9b3361

Ответ 1

Это работает для меня:

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();
}

Ответ 2

Вы можете создать ZipInputStream следующим образом:

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();

Ответ 3

Вы можете хранить несжатые файлы непосредственно в активах (т.е. распаковать почтовый индекс в активы/папку). Таким образом, вы можете получить доступ к файлам напрямую, и они будут сжаты в любом случае при создании APK.