IOException при чтении из InputStream
У меня возникает странная проблема при чтении из InputStream на платформе Android. Я не уверен, что это конкретная проблема с Android, или что-то, что я делаю неправильно вообще.
Единственное, что касается Android, это вызов:
InputStream is = getResources().openRawResource(R.raw.myfile);
Это возвращает InputStream для файла из активов Android. В любом случае, здесь, где я столкнулся с проблемой:
bytes[] buffer = new bytes[2];
is.read(buffer);
Когда функция read() запускает исключение IOException. Странно то, что если я делаю два последовательных однобайтовых чтения (или любое количество однобайтовых чтений), исключений нет. В примере это работает:
byte buffer;
buffer = (byte)buffer.read();
buffer = (byte)buffer.read();
Любая идея, почему работают два последовательных однобайтовых чтения, но один вызов читать оба сразу бросает исключение? InputStream кажется прекрасным... is.available()
возвращает более миллиона байт (как и должно быть).
Трассировка стека показывает эти строки непосредственно перед InputStream.read()
:
java.io.IOException
at android.content.res.AssetManager.readAsset(Native Method)
at android.content.res.AssetManager.access$800(AssetManager.java:36)
at android.content.res.AssetManager$AssetInputStream.read(AssetManager.java:542)
Изменение размера буфера на один байт по-прежнему вызывает ошибку. Похоже, что исключение возникает только при чтении в массив байтов.
Если я усекаю файл до 100 000 байт (файл: 1,917,408 байт изначально), он отлично работает. Есть ли проблема с файлами определенного размера?
Любая помощь приветствуется!
Спасибо!
Ответы
Ответ 1
(мой пост для разработчиков Android не появляется, поэтому я попробую переустановить его здесь)
IIRC, эта проблема возникает из-за попытки доступа к файлам, сжатым как часть построения APK.
Следовательно, чтобы обойти проблему, дайте ей расширение файла, которое не будет сжато. Я забыл список пропущенных расширений, но типы файлов, которые, как известно, уже сжаты (например, mp3, jpg), могут работать.
Ответ 2
Изменение расширения файла на .mp3, чтобы избежать сжатия файлов, работает, но APK приложения намного больше (в моем случае 2,3 МБ вместо 0,99 МБ).
Есть ли другой способ избежать этой проблемы?
Вот мой ответ:
Загрузите файлы размером более 1 миллиона из папки с файлами
Ответ 3
Вы можете сжать файл для себя с помощью GZIP и распаковать его с помощью класса GZIPInputStream.
http://developer.android.com/reference/java/util/zip/GZIPInputStream.html
Ответ 4
Вы правы, поскольку существует ограничение на размер для извлечения файлов. Возможно, вы захотите разделить большие файлы на 1MB-фрагменты и иметь способ, с помощью которого вы знаете, какие файлы сделаны из каких-либо частей, сшивая их снова вместе, когда ваше приложение запускается.