2011-03-17 13 views
14

Tengo un FileInputStream creado utilizando Context.openFileInput(). Ahora quiero convertir el archivo en una matriz de bytes.FileInputStream a matriz de bytes en la aplicación de Android

Desafortunadamente, no puedo determinar el tamaño de la matriz de bytes requerida para FileInputStream.read(byte[]). El método available() no funciona, y no puedo crear un archivo para verificar su longitud utilizando la ruta de acceso específica, probablemente porque la ruta de acceso no es accesible para usuarios que no son root.

leí sobre ByteArrayOutputStream, y parece que ajustar dinámicamente el tamaño de la matriz de bytes para adaptarse, pero no puede llegar a leer desde el FileInputStream escribir en el ByteArrayOutputStream.

+0

posible duplicado de [Android - ir de un URI a un InputStream a una matriz de bytes] (http://stackoverflow.com/questions/2436385/android-getting -from-a-uri-a-un-inputtream-a-un-byte-array) – Thilo

+2

El 'byte []' que proporcione a 'leer (byte [])' no es el tamaño completo de lo que sea es que estás tratando de leer. Es un búfer que puede contener el número máximo de bytes que está dispuesto a leer a la vez, y cada llamada a 'lectura 'colocará cierta cantidad de bytes en ese búfer y devolverá un número que le indicará cuántos bytes ingresó. – ColinD

Respuesta

42

Esto debería funcionar.

InputStream is = Context.openFileInput(someFileName); 
ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
byte[] b = new byte[1024]; 
while ((int bytesRead = is.read(b)) != -1) { 
    bos.write(b, 0, bytesRead); 
} 
byte[] bytes = bos.toByteArray(); 
+0

Gracias, lo resolví con otro método. 'while (is .available> 0) { bos.write (is.read()) }' –

+5

@Jeremy: el método de Robby es la forma estándar de hacer esto en Java. Lee la entrada de hasta 1024 bytes a la vez ... la tuya lo lee de 1 byte a la vez. Aconsejo usar su sugerencia. – ColinD

+0

este método funcionará solo en el dispositivo rooteado. – Mihir

0

Para que el método funcione en cualquier dispositivo y aplicacion sólo tiene que reemplazar:

InputStream is = Context.getContentResolver().openInputStream(yourFileURi); 

De esta manera puede codificar archivos externos.

1

se puede pre-asignar la matriz de bytes mediante

int size = context.getFileStreamPath(filename).length(); 

De esta manera, se evitará la asignación de trozos de memoria cada vez que se llena ByteArrayOutputStream.

5

Esta es la forma más fácil

FileInputStream fis = openFileInput(fileName); 

byte[] buffer = new byte[(int) fis.getChannel().size()]; 

fis.read(buffer); 
+0

Tenga en cuenta que el método 'openFileInput' no acepta separadores de ruta. Entonces, en lugar de 'openFileInput', puede usar' fis = new FileInputStream (new File (filename_with_path)); ' – Atul

Cuestiones relacionadas