Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ByteArrayOutputStream对RAM内存的外部使用_Java_Android_Out Of Memory_Bytearrayoutputstream - Fatal编程技术网

Java ByteArrayOutputStream对RAM内存的外部使用

Java ByteArrayOutputStream对RAM内存的外部使用,java,android,out-of-memory,bytearrayoutputstream,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[] bu

所以我的问题听起来像这样。我需要创建一个文件的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;
}
问题是,当我尝试对文件进行编码时,大约20MB(确切的文件大小是19,35MB),我会得到一个OutOfMemoryException

之前:

之后:

我做错了什么?如何解决此问题?提前谢谢

我做错了什么

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

如何解决此问题

如果“这个问题”是“创建一个大约26MB的base64编码数据字符串”,那么没有可靠的方法可以做到这一点。通过创建这样一个字符串,您必须找到其他解决任何问题的方法

ByteArrayOutputStream output = new ByteArrayOutputStream();
Base64OutputStream output64 = new Base64OutputStream(output, Base64.DEFAULT);
我做错了什么

您正试图使用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上传该文件

如果您自己使用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上传该文件。

我认为这就是问题所在:encodedFile=output.toString();我知道问题出在整个ByteArrayOutputStream中,但我不知道还能用什么=(Commonware对此进行了解释。我建议将编码字符串写入文件,然后从存储器中使用它,而不是从memmory
中使用它。我只是不知道还可以使用什么
。请告诉我现在如何上传base64字符串。我构建了字符串,然后根据我发送到服务器的请求体的构建内容将其放入POJO中。我认为这是pro问题:encodedFile=output.toString();我知道问题完全出在ByteArrayOutputStream上,但我不知道还能用什么=(Commonware对此进行了解释。我建议将编码字符串写入文件,然后从存储器中使用它,而不是从memmory
中使用它。我只是不知道还可以使用什么
。请告诉我现在如何上传base64字符串。我构建字符串,然后根据我发送到服务器的请求体的构建内容将其放入POJO中。我需要做的是将文件上载到远程服务器,它只接受作为base64字符串的文件,因此我实际上没有选择。@VladZbuker:服务器可以接受作为base64的数据,但服务器根本不关心在Android中这是否是单个字符串。我明白了,但我不太明白如何拆分字符串或类似的内容:(@VladZbuker:greenapps的回答包含了几个选项。细节在很大程度上取决于您使用的HTTP API(OkHttp,
HttpUrlConnection
等)。我在应用程序中使用REFORMAT2 for all REST,所以我只能使用OkHttp。问题是,我需要将文件上载到远程服务器,它只接受一个文件作为base64字符串,所以我实际上没有选择。@VladZbuker:服务器可以接受数据作为base64,但服务器根本不关心这是否是Android中的单个字符串。I g这不是重点,但我不太明白如何拆分字符串或类似的东西:(@VladZbuker:greenapps的答案包含了几个选项。细节在很大程度上取决于您使用的HTTP API(OkHttp,
HttpUrlConnection
,等等)。我在应用程序中对所有其余部分使用改型2,这样我就可以使用OkHttp了。