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

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

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

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

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

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

1 Ответ

1 голос
/ 26 апреля 2019

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

...