Pregunta

Estoy corriendo en un extraño problema, mientras que la lectura de un InputStream en la plataforma Android.No estoy seguro de si esto es un Androide tema específico, o algo estoy haciendo mal en general.

La única cosa que es Android, es esta llamada:

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

Esto devuelve un InputStream para un archivo desde el Android activos.De todos modos, aquí es donde me encuentro con el problema:

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

Cuando el read() se ejecuta, se produce una IOException.Lo extraño es que si hago dos secuencial de un solo byte lee (o cualquier número de byte único lee), no hay ninguna excepción.En el ejemplo, esto funciona:

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

Alguna idea de por qué dos secuencial de un solo byte lee de trabajo, pero una llamada a leer los dos a la vez, se produce una excepción?El InputStream parece estar bien... is.available() devuelve más de un millón de bytes (como debe ser).

El 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 de búfer en un solo byte todavía produce el error.Parece que la excepción sólo se produce cuando la lectura en una matriz de bytes.

Si me truncar el archivo de 100.000 bytes (archivo es:1,917,408 bytes originalmente) funciona bien.Hay un problema con los archivos de un tamaño determinado?

Cualquier ayuda es muy apreciada.
Gracias!

¿Fue útil?

Solución

(mi mensaje a android-developers no aparece, por lo que voy a intentar 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 evitar el problema, darle una extensión de archivo que no se comprime. Me olvido de la lista de extensiones de lo que se omiten, pero los tipos de archivos conocidos por estar ya comprimido (por ejemplo, mp3, jpg) puede funcionar.

Otros consejos

Cambio de la extensión del archivo a .mp3 para evitar la compresión de archivos funciona, pero el APK de la aplicación es mucho más grande (en mi caso 2.3 MB en lugar de 0,99 MB).

¿Hay alguna otra manera de evitar este problema?

Aquí está mi respuesta: 1M de la carpeta activos

Puede comprimir el archivo por sí mismo con GZIP y descomprimirlo con la clase GZIPInputStream.

http://developer.android.com/reference/java/ util / zip / GZIPInputStream.html

Tiene usted razón, en el que hay un cierto límite de tamaño para extraer los archivos. Es posible que desee dividir archivos grandes en trozos de 1 MB, y tener un método por el cual usted sabe qué archivos están hechas de piezas que, coserlos juntos de nuevo cuando se ejecuta la aplicación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top