Android: ZipFile() java.util.zip.ZipException: файл слишком короткий, чтобы быть zip-файлом: 0
Я работаю над проектом (с использованием Android Studio 3.1.4), который читает в нейронной сети, которая хранится в виде файла.zip, для дальнейшего использования с DL4J в Android.
Я пытаюсь открыть этот файл.zip, расположенный в каталоге моих проектов res\raw. Для этого я пытаюсь использовать метод ZipFile() из java.util.zip.
Скриншот местоположения neuralnet.zip
Проблема:
Следующий код вызывает исключение:
File model_file = new File(String.valueOf(this.getResources().openRawResource(R.raw.neuralnet)));
ZipFile zipFile = new ZipFile(model_file);
Исключение:
msgstr "java.util.zip.ZipException: файл слишком короткий, чтобы быть zip-файлом: 0"
Поэтому я не могу загрузить модель. Тестирование этого на смоделированном устройстве под управлением Android API 24
В API 26 исключение другое:
java.io.FileNotFoundException: файл не существует: android.content.res.AssetManager$AssetInputStream@ddde727
Есть ли у кого-нибудь опыт использования ZipFile() или загрузки моделей нейросетей с использованием DL4J в Android?
Может ли быть что-то особенное в build.gradle?
Любой вклад приветствуется!
Что я пробовал:
- Проверил.zip файл, убедился что он существует.
- Удостоверившись, что.zip - это просто контейнер, а файл не сжат, архивируя содержащиеся в нем 3 файла, используя 7Zip без сжатия как.zip
- Проверено разрешение READ_EXTERNAL_STORAGE, хотя я не думаю, что это необходимо
- попытался использовать полный путь вместо использования this.getResources().openRawResource(R.raw.neuralnet)
Разрешения Android: у меня работает Android api > 23, и я запрашиваю разрешение READ_EXTERNAL_STORAGE во время выполнения.
Манифест включает в себя:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Спасибо,
Mo
2 ответа
Ваша проблема - способ открытия файла.
Для открытия необработанного файла посмотрите ссылки ниже:
https://developer.android.com/guide/topics/resources/providing-resources
Я смог открыть содержимое архива, обойдя метод ZipFile(), который дал мне еще одну ошибку, поскольку он ожидает путь, а не идентификатор ресурса.
Тем не менее, открывая заархивированные файлы, я использовал метод, предложенный "No Body":
InputStream ins1 = getResources().openRawResource(getResources().getIdentifier("configuration", "raw", getPackageName()));
InputStream ins2 = getResources().openRawResource(getResources().getIdentifier("coefficients", "raw", getPackageName()));
InputStream ins3 = getResources().openRawResource(getResources().getIdentifier("updaterstate", "raw", getPackageName()));
model = restoreMultiLayerNetwork(ins1, ins2, ins3, false);