在Android上转换Base64中的文件(<100Mo)

我想从SD卡转换为Base64文件,但似乎文件太大,我得到一个OutOfMemoryError。

这是我的代码:

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); 

有没有办法绕过OutOfMemoryError而提交stringattachedFile?

Solutions Collecting From Web of "在Android上转换Base64中的文件(<100Mo)"

Base64编码需要3个input字节并将它们转换为4个字节。 所以如果你有100 MB的文件,最终将在Base64 133 MB。 当您将其转换为Javastring( UTF-16 )时,它的大小将会翻倍。 更不要说,在转换过程中,你将在内存中保存多个副本。 不pipe你怎么翻这个都不行。

这是使用Base64OutputStream稍微更优化的代码,将需要比你的代码更less的内存,但我不会屏住呼吸。 我的build议是通过跳过转换为string,并使用临时文件stream作为输出,而不是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; }