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), могут работать.

Ответ 4

Вы правы, поскольку существует ограничение на размер для извлечения файлов. Возможно, вы захотите разделить большие файлы на 1MB-фрагменты и иметь способ, с помощью которого вы знаете, какие файлы сделаны из каких-либо частей, сшивая их снова вместе, когда ваше приложение запускается.