convertir bytes arreglo array archivo android

arreglo - Android: ¿pasar de un Uri a un InputStream a una matriz de bytes?



java fileoutputstream to bytes (6)

Estoy tratando de pasar de un Uri de Android a una matriz de bytes.

Tengo el siguiente código, pero me sigue diciendo que la matriz de bytes tiene una longitud de 61 bytes, aunque el archivo es bastante grande, así que creo que puede estar convirtiendo la cadena Uri en una matriz de bytes, en lugar del archivo :(

Log.d(LOG_TAG, "fileUriString = " + fileUriString); Uri tempuri = Uri.parse(fileUriString); InputStream is = cR.openInputStream(tempuri); String str=is.toString(); byte[] b3=str.getBytes(); Log.d(LOG_TAG, "len of data is " + imageByteArray.length + " bytes");

Por favor, ¿alguien puede ayudarme a averiguar qué hacer?

La salida es "fileUriString = content: // media / external / video / media / 53" y "len of data is 61 bytes".

¡Gracias!


Compartiendo mi idea: D

private static byte[] getStringFromInputStream(InputStream is) { BufferedReader br = null; StringBuilder sb = new StringBuilder(); byte[] bReturn = new byte[0]; String line; try { br = new BufferedReader(new InputStreamReader(is, "Big5")); while ((line = br.readLine()) != null) { sb.append(line); } String sContent = sb.toString(); bReturn = sContent.getBytes(); } catch (IOException e) { e.printStackTrace(); } finally { if (br != null) { try { br.close(); } catch (IOException e) { e.printStackTrace(); } } } return bReturn; }



Con Google Guava, puede usar ByteStreams.toByteArray(InputStream) para obtener todos los bytes en la secuencia de entrada:

InputStream is = ...; byte[] bytes = ByteStream.toByteArray(is);


Si tiene un Uri, en lugar de un nombre de archivo normal, debe usar Content Resolver. Android: ¿Obtener un archivo URI de un contenido URI?

Intenté esto, y funciona. Uri uri; // es algo, lo tengo de un selector de archivos. Por supuesto, debo estar seguro, que el uri apunta a un nombre de archivo, y no es una imagen, o audio, o algo más ...

InputStream is=getContentResolver().openInputStream(uri); InputStreamReader ir=new InputStreamReader(is); bu=new BufferedReader(ir); String s; while ((s=bu.readLine())!=null){ //do something with the line... } bu.close();

He omitido algunos try-catch-finalmente del código, pero las cosas más importantes están aquí. Lo primero es que, si tiene un uri, no puede usar el lector de archivos estándar.


is.toString() le dará una representación de cadena de la instancia de InputStream, no su contenido.

Debe leer () bytes del InputStream en su matriz. Hay dos métodos de lectura para hacer eso, read() que lee un solo byte a la vez, y leer (bytes [] bytes) que lee bytes de InputStream en la matriz de bytes que se le pasa.

Actualización: para leer los bytes dado que un InputStream no tiene una longitud como tal, necesita leer los bytes hasta que no quede nada. Sugiero que crear un método para ti mismo como este es un buen punto de partida simple (así es como lo haría en Java al menos).

public byte[] readBytes(InputStream inputStream) throws IOException { // this dynamically extends to take the bytes you read ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream(); // this is storage overwritten on each iteration with bytes int bufferSize = 1024; byte[] buffer = new byte[bufferSize]; // we need to know how may bytes were read to write them to the byteBuffer int len = 0; while ((len = inputStream.read(buffer)) != -1) { byteBuffer.write(buffer, 0, len); } // and then we can return your byte array. return byteBuffer.toByteArray(); }


while ((len = inputStream.read(buffer)) != -1)

debiera ser

while (inputStream.available() >0 && (len = inputStream.read(buffer)) != -1)

De esta manera, la lectura no se bloqueará si la secuencia no tiene bytes disponibles como se explica en esta respuesta .