Convertir un archivo (<100Mo) en Base64 en Android

Estoy intentando convertir un archivo del sdcard a Base64 pero parece que el archivo es demasiado grande y consigo un OutOfMemoryError.

Aquí está mi código:

InputStream inputStream = null;//You can get an inputStream using any IO API inputStream = new FileInputStream(file.getAbsolutePath()); byte[] bytes; byte[] buffer = new byte[8192]; int bytesRead; ByteArrayOutputStream output = new ByteArrayOutputStream(); try { while ((bytesRead = inputStream.read(buffer)) != -1) { output.write(buffer, 0, bytesRead); } } catch (IOException e) { e.printStackTrace(); } bytes = output.toByteArray(); attachedFile = Base64.encodeToString(bytes, Base64.DEFAULT); 

¿Hay una manera de dar la vuelta al OutOfMemoryError mientras que archiva el archivo adjunto de la secuencia?

Base64 codificación Base64 toma 3 bytes de entrada y los convierte en 4 bytes. Así que si usted tiene 100 Mb archivo que terminará hasta ser 133 Mb en Base64 . Cuando lo convierte en cadena Java ( UTF-16 ), el tamaño se duplicará. Por no hablar de que durante el proceso de conversión en algún momento tendrá varias copias en la memoria. No importa cómo usted da vuelta a esto apenas va a trabajar.

Este es un código ligeramente más optimizado que utiliza Base64OutputStream y necesitará menos memoria que su código, pero no aguantaría la respiración. Mi consejo sería mejorar ese código más allá saltando la conversión a la secuencia, y usar la secuencia temporal del archivo como salida en vez de ByteArrayOutputStream .

 InputStream inputStream = null;//You can get an inputStream using any IO API inputStream = new FileInputStream(file.getAbsolutePath()); byte[] buffer = new byte[8192]; int bytesRead; ByteArrayOutputStream output = new ByteArrayOutputStream(); Base64OutputStream output64 = new Base64OutputStream(output, Base64.DEFAULT); try { while ((bytesRead = inputStream.read(buffer)) != -1) { output64.write(buffer, 0, bytesRead); } } catch (IOException e) { e.printStackTrace(); } output64.close(); attachedFile = output.toString(); 
 // Converting File to Base64.encode String type using Method public String getStringFile(File f) { InputStream inputStream = null; String encodedFile= "", lastVal; try { inputStream = new FileInputStream(f.getAbsolutePath()); byte[] buffer = new byte[10240];//specify the size to allow int bytesRead; ByteArrayOutputStream output = new ByteArrayOutputStream(); Base64OutputStream output64 = new Base64OutputStream(output, Base64.DEFAULT); while ((bytesRead = inputStream.read(buffer)) != -1) { output64.write(buffer, 0, bytesRead); } output64.close(); encodedFile = output.toString(); } catch (FileNotFoundException e1 ) { e1.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } lastVal = encodedFile; return lastVal; } 
  • ¿Cómo obtener la lista de archivos de una carpeta específica en el almacenamiento interno?
  • Java.io.filenotfoundexception abierto eacces fallidos (permiso denegado) en el dispositivo
  • Abrir archivo PDF de Android
  • Android: write failed: EPIPE (Broken pipe) Error al escribir el archivo
  • No se puede eliminar el archivo con la clase File
  • Permitir que el usuario seleccione la ruta de acceso para guardar el archivo en Android
  • Abrir archivo XML desde res / xml en Android
  • Archivo nunca descargado
  • Android - descargar el archivo JSON de url
  • Cómo guardar archivos en el directorio público de almacenamiento externo DOCUMENTS en Android 4.1.2
  • ¿Cómo se establecen los atributos de usuario extendido en los archivos de Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.