2009-08-13 15 views
10

Me encuentro con un problema extraño al leer InputStream en la plataforma Android. No estoy seguro si este es un problema específico de Android, o algo que estoy haciendo mal en general.IOException durante la lectura de InputStream

La única cosa que es específica Android es esta llamada:

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

Esto devuelve un InputStream para un archivo de los activos Android. De todas formas, aquí es donde me encuentro con el problema:

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

Cuando la lectura() realiza lanza una IOException . Lo extraño es que si hago dos lecturas secuenciales de un solo byte (o cualquier número de lecturas de bytes individuales), no hay excepción. En el ejemplo, esto funciona:

byte buffer; 
buffer = (byte)buffer.read(); 
buffer = (byte)buffer.read(); 

Cualquier idea de por qué dos de un solo byte lecturas secuenciales de trabajo pero una llamada para leer dos a la vez produce una excepción? El InputStream parece estar bien ... is.available() devuelve más de un millón de bytes (como debería).

Seguimiento de la pila muestra estas líneas justo antes de la 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) 

Cambiar el tamaño del búfer a un solo byte todavía arroja el error. Parece que la excepción solo se plantea al leer en una matriz de bytes.

Si trunco ​​el archivo a 100.000 bytes (el archivo es: 1.917.408 bytes originalmente) funciona bien. ¿Hay algún problema con archivos de un cierto tamaño?

¡Se agradece cualquier ayuda!
Gracias!

+0

Un archivo de 1 MB trabajado, pero un archivo de 1,5 MB no lo hicieron. ¿Hay alguna restricción de tamaño para los activos? – DJayC

Respuesta

14

(mi mensaje a android-developers no aparece, así que trataremos de volver a colocar aquí)

IIRC, este problema viene de tratar de acceder a los archivos que se comprimieron como parte de la construcción de la APK.

Por lo tanto, para solucionar el problema, proporciónele una extensión de archivo que no se comprimirá. Olvidé la lista de las extensiones omitidas, pero los tipos de archivos que ya se han comprimido (por ejemplo, mp3, jpg) pueden funcionar.

+1

Tienes toda la razón. Cambiar el nombre de la extensión a .MP3 funcionó. Este es un error tonto, y debería haber una manera de decirle que no comprima un cierto archivo si va a causar este tipo de problema. Gracias – DJayC

+0

@ CommonsWare: ¿Hay algún otro método para leer el archivo comprimido del activo? Me refiero a que el archivo se comprima durante el empaquetado enAPK, pero podemos leer el archivo de activos? – VSB

0

Tiene razón, ya que hay un cierto límite de tamaño para extraer archivos. Es posible que desee dividir los archivos más grandes en piezas de 1MB, y tener un método mediante el cual sepa qué archivos están hechos de esas piezas, uniéndolos nuevamente cuando se ejecute su aplicación.

3

Cambiando la extensión de archivo a .mp3 para evitar que la compresión de archivos funcione, pero el APK de la aplicación es mucho más grande (en mi caso 2.3 MB en vez de 0.99 MB).

¿Hay alguna otra forma de evitar este problema?

Aquí es mi respuesta: Load files bigger than 1M from assets folder

Cuestiones relacionadas