Android: эффективно скопируйте zip-файл с тысячами файлов из ресурсов во внутреннее хранилище

1

TL; DR: есть ли способ скопировать zip файл, содержащий тысячи файлов из ресурсов Android, во внутреннее хранилище, что более эффективно, чем использование ZipInputStream?

В моем приложении для Android есть несколько ресурсов, которые необходимо скопировать в память устройства при первом запуске. Они хранятся в виде zip файлов в ZipInputStream и копируются через ZipInputStream как описано здесь (в методе unzip). Имеется 10 zip файлов общим объемом 36 МБ, а процесс распаковки/копирования занимает около 3 секунд.

Проблема: мне нужно добавить новый ресурс объемом 39 МБ, но он добавляет около 30 секунд к процессу. Я догадываюсь, что это потому, что ресурс состоит из 5500 файлов (в среднем около 7 КБ каждый). Поскольку при запуске мне нужны ресурсы, запуск этого в фоновом режиме невозможен, и 30+ секунд - это действительно много времени, чтобы показать заставку.

В этом посте предлагается использовать ZipFile вместо ZipInputStream но, похоже, он не работает должным образом в Android, как отмечалось здесь и в других сообщениях S/O, и я испытываю то же исключение ZipException, описанное там (обратите внимание, это происходит после копирования файла zip во внутреннее хранилище - Ресурсы Android предоставляют только поток, а не файл, поэтому zip файл необходимо скопировать из ресурсов, прежде чем можно будет использовать метод ZipFile).

Есть ли более эффективный способ сделать это?

Теги:
unzip
android-assets

1 ответ

0

К сожалению - нет, поскольку запись каждого файла состоит из 3 основных операций: создание и открытие файла для записи, запись данных в файл, закрытие файла для записи. Самый быстрый способ скопировать такое количество файлов - поместить их в один файл, например, двоичный файл или файл базы данных sqlite. Или вы можете найти способ читать прямо из архива. Имейте в виду, что вы не сможете удалить этот файл из ресурсов (по крайней мере, я никогда не слышал о решении для этого), поэтому он кажется мне бесполезным.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню