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:
- El mejor método para guardar datos - preferencias, sqlite, serializable u otro?
- Descargar archivo dentro de WebView
- Cómo obtener la ruta interna y externa de sdcard en android
- Guardar archivo en android, por lo que el usuario no puede leer
- Iterar a través de un directorio especificado en Android
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?
- ¿Por qué no se puede mostrar la carpeta "datos" como en el explorador de archivos DDMS?
- Lectura de texto unicode de los activos
- ¿Cómo obtener una instancia de archivo de un drawable?
- GetExternalFilesdir Fail
- El archivo contiene un separador de ruta.
- Transmita la salida logcat de android a una tarjeta sd
- El método de archivo mkdirs () no funciona en android / java
- Android: Obtener un archivo URI de un URI de contenido?
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; }
- En Android, ¿qué son las inserciones de ventana?
- ¿Cómo implementar la aplicación de compra mediante Cordova plugin?