通过ByteArrayOutputStream扩展RAM内存的使用

时间:2017-01-26 15:25:48

标签: java android out-of-memory bytearrayoutputstream

所以我的问题听起来像这样。我需要创建一个base64编码的文件字符串,为此,我使用这个方法:

public String getStringFile(File f) {
    InputStream inputStream = null;
    String encodedFile= "", lastVal;
    try {
        inputStream = new FileInputStream(f.getAbsolutePath());

        byte[] buffer = new byte[10240];
        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 (Exception e) {
        e.printStackTrace();
    }

    lastVal = encodedFile;

    return lastVal;
}

当我尝试编码大约20 Mb的文件(确切文件大小为19,35 Mb)时,我得到一个OutOfMemoryException。

在:

enter image description here

后:

enter image description here

我做错了什么,如何解决这个问题?提前谢谢。

2 个答案:

答案 0 :(得分:4)

  

我做错了什么

您正在尝试使用base64将~20MB文件编码为字符串。在许多Android设备上,您将没有足够的堆空间来使单个内存分配很大。

  

我该如何解决这个问题?

如果“此问题”是“创建~26MB字符串的base64编码数据”,则没有可靠的方法来执行此操作。您必须通过创建这样的字符串找到解决您尝试解决的任何问题的其他解决方案。

答案 1 :(得分:2)

ByteArrayOutputStream output = new ByteArrayOutputStream();
Base64OutputStream output64 = new Base64OutputStream(output, Base64.DEFAULT);

如果您自己使用HttpUrlConnection上传base64,您可以使用ByteArrayOutputStream并替换上面的行 - 而直接上传 - 使用

OutputStream output = con.getOutputStream();
Base64OutputStream output64 = new Base64OutputStream(output, Base64.DEFAULT);

未测试。

您当然也可以直接将base64编码为FileOutputStream

OutputStream output = new FileOutputStream(......);
Base64OutputStream output64 = new Base64OutputStream(output, Base64.DEFAULT);

然后使用POJO上传该文件。