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

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

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

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

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


person hdort    schedule 23.07.2012    source источник


Ответы (3)


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

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();
}
person ƒernando Valle    schedule 01.07.2014

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

person Mark    schedule 11.04.2014

Вы можете создать 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();
person Slickelito    schedule 23.07.2012
comment
Спасибо, но, как я уже писал, я уже использую ZipInputStream, но поиск в ZIP с использованием getNextEntry() слишком медленный! - person hdort; 23.07.2012
comment
Вы читаете файл с буфером? Я привел свой код с примером. У меня работает очень хорошо. - person Slickelito; 23.07.2012
comment
Медленно не распаковка, а поиск нужного файла в zip-архиве. Есть ли что-то похожее на ZipFile.getEntry(filename) для ZipInputStream? - person hdort; 23.07.2012