Android: ZipFile, FileNotFoundException при использовании файлов активов

У меня проблема.

Я использую этот код для чтения содержимого zip-файла:

    File file = new File(TogglesManager.EXTERNAL_STORAGE_THEMES_DIRECTORY+"filename.zip");
    ZipFile zip = new ZipFile(file);

Но когда я пытаюсь использовать активы, у меня появляется FileNotFoundException.

Чтобы прочитать zip-файл актива, я использую этот код:

    File file = c.getFileStreamPath("assetsFile.zip");
    ZipFile zip = new ZipFile(file);

«Файл» не нулевой, потому что если я напишу file.getName();, я увижу правильное имя файла.

Я не хочу использовать ZipInputStream класс, а только ZipFile


person Meroelyth    schedule 19.11.2012    source источник


Ответы (1)


Вы не можете получить доступ к активам, используя обычные операции с файлами. Вам придется использовать

AssetManager assetManager = mContext.getAssets();
InputStream is = assetManager.open("assetsFile.zip");

Но поскольку ZipFile не принимает InputStream в качестве параметра, вам придется скопировать файл ресурса во внутреннюю память, а затем использовать File

Кроме того, насколько мне известно, apk заархивирован, поэтому хранение заархивированного файла внутри ресурсов может не сильно изменить используемое хранилище, поэтому, возможно, вам не нужно использовать zip-файл внутри ресурсов.

person nandeesh    schedule 19.11.2012
comment
Большое спасибо .. есть другой способ вместо ZipFile или ZipInputStream читать Zip-файл без его извлечения? - person Meroelyth; 19.11.2012
comment
Я не слишком уверен, но ZipInputStream должен выполнять работу, используя InputStream, который вы получили из assetsManager.open. - person nandeesh; 19.11.2012
comment
Further AFAIK, apk is zipped, so storing a zipped file inside assets might not change storage used by much, so maybe you donot need to use zipfile inside assets. Подтверждено и спасибо - person Muhammad Babar; 02.02.2015
comment
можете ли вы подтвердить справедливость утверждения @MuhammadBabar - person Killer; 03.10.2019
comment
@Killer, поскольку APK сам заархивирован, поэтому связанные файлы будут автоматически заархивированы. Но извините, поскольку ветка довольно старая, поэтому я не могу подтвердить достоверность. Кстати, вы можете проверить это самостоятельно, добавив файлы, как заархивированные, так и разархивированные, и проверить размер. - person Muhammad Babar; 07.10.2019