将byte []转换为Base64 String会抛出OutOfMemoryError

时间:2015-08-13 11:34:23

标签: android base64 android-file

我正在尝试将文件转换为Base64字符串。对于小尺寸文件,它可以很好地工作,对于大于500mb的文件,它会抛出OutOfMemoryError。我要将文件转换为Base64 encodedString,因为我的服务器端需要通过Base64 encodedstring上传文件。是否可以通过此方法转换和发送500mb文件?提前谢谢。

byte[] bytes = null;
            InputStream inputStream;
            try {
                inputStream = new FileInputStream(mFilepath);
                byte[] buffer = new byte[1024];
                int bytesRead;
                ByteArrayOutputStream output = new ByteArrayOutputStream();
                try {
                    while ((bytesRead = inputStream.read(buffer)) != -1) {
                        output.write(buffer, 0, bytesRead);
                    }
                    inputStream.close();
                    output.flush();
                    output.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                bytes = output.toByteArray();
            } catch (FileNotFoundException e1) {
                e1.printStackTrace();
            }

            // Here it throws OutOfMemoryError 
            String encodedString = Base64.encodeToString(bytes, Base64.DEFAULT);

然后我使用HttpURLConnection将encodedString传递给服务器。

1 个答案:

答案 0 :(得分:0)

  

对于大于500mb的文件,它会抛出OutOfMemoryError

当然。基于Java的Android应用程序的堆限制将远远小于500MB,更不用说两个数据副本,一个是扩展(Base64)格式。有数以亿计的设备甚至没有整个设备那么多的RAM,更不用说你的应用程序使用了。

  

是否可以通过此方法转换并发送500mb文件?

只有你可以以某种方式流式传输转换后的字节。转换少量字节,将它们写入套接字,转换下一小部分字节,将它们写入套接字,依此类推。您没有实际的方法将整个500MB文件转换为内存中的Base64并将其作为字符串传输。