繁体   English   中英

ByteArrayOutputStream过度使用RAM内存

[英]Extream usage of RAM memory by 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。

之前:

在此处输入图片说明

后:

在此处输入图片说明

我在做什么错,如何解决此问题? 提前致谢。

我究竟做错了什么

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

我该如何解决这个问题?

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

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上传该文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM