2009-08-13 10 views
10

У меня возникает странная проблема при чтении с InputStream на платформе Android. Я не уверен, что это конкретная проблема Android, или что-то, что я делаю неправильно в целом.IOException при чтении из InputStream

Единственное, что это Android специфический этот вызов:

InputStream is = getResources().openRawResource(R.raw.myfile); 

Это возвращает InputStream для файла из Android активов. В любом случае, вот где я бегу в вопрос:

bytes[] buffer = new bytes[2]; 
is.read(buffer); 

Когда чтение() выполняет он бросает 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 байт изначально), он отлично работает. Есть ли проблемы с файлами определенного размера?

Любая помощь приветствуется!
Спасибо!

+0

Файл 1mb работал, но 1.5MB файл не сделал. Есть ли ограничение по размеру для активов? – DJayC

ответ

14

(мой пост для Android-разработчиков не отображается, так что я постараюсь перепроведением здесь)

IIRC, эта проблема возникает от попыток получить доступ к файлам, которые были сжаты в рамках строительство APK.

Следовательно, чтобы обойти проблему, дайте ей расширение файла, которое не будет сжато. Я забыл список пропущенных расширений, но типы файлов, которые, как известно, уже сжаты (например, mp3, jpg), могут работать.

+1

Ты абсолютно прав. Переименовано расширение в .MP3. Это глупая ошибка, и должен быть способ сказать ей не сжимать определенный файл, если это вызовет такой тип проблемы. Спасибо – DJayC

+0

@ CommonsWare: Есть ли другие методы для чтения сжатого файла из актива? Я имею в виду, что файл сжимается во время упаковки вAPK, но мы можем читать файл актива? – VSB

0

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

3

Изменение расширения файла на .mp3, чтобы избежать сжатия файлов, но APK приложения намного больше (в моем случае 2,3 МБ вместо 0,99 МБ).

Есть ли другой способ избежать этой проблемы?

Вот мой ответ: Load files bigger than 1M from assets folder