Android 位于java.net.URLEncoder.encode的OutOfMemoryError

Android 位于java.net.URLEncoder.encode的OutOfMemoryError,android,urlencode,out-of-memory,Android,Urlencode,Out Of Memory,我想使用URLEncoder.encode对Base64编码字符串进行编码,该字符串包含图像,它可以是任何大小(1MB-8MB) 甚至我也在块中尝试过这件事,但后来StringBuffer.append出现了OutOfMemoryError private String encodeChunckByChunck(String str, final int chunkSize) { StringBuffer buffer = new StringBuffer(); final in

我想使用URLEncoder.encode对Base64编码字符串进行编码,该字符串包含图像,它可以是任何大小(1MB-8MB)

甚至我也在块中尝试过这件事,但后来StringBuffer.append出现了OutOfMemoryError

private String encodeChunckByChunck(String str, final int chunkSize) {
    StringBuffer buffer = new StringBuffer();
    final int size = str.length();
    try {
        for (int i = 0; i < size; i += chunkSize) {
            Log.d("Encode", "..........inside loop");
            if (i + chunkSize < size) {
                Log.d("Encode", "..........full chunk");
                buffer.append(URLEncoder.encode(str.substring(i, i + chunkSize), "UTF-8"));
            } else {
                Log.d("Encode", "..........half chunk");
                buffer.append(URLEncoder.encode(str.substring(i, size), "UTF-8"));
            }
        }
    } catch (UnsupportedEncodingException e) {
        Log.d("Encode", "..........exception:" + e.getMessage());
        e.printStackTrace();
    }
    Log.d("Encode", "..........before returning function");
    return buffer.toString();
}
private-String-encodeChunckByChunck(String-str,final int-chunkSize){
StringBuffer=新的StringBuffer();
最终整数大小=str.length();
试一试{
for(int i=0;i
你能把它一块一块地写进文件,而不是存储在内存中吗?否则,在你的应用程序的其他地方使用更少的内存(释放一些大变量)。

假设(正如其他人已经指出的,我同意)这是一个内存问题,如果我是你,我会实现自定义OutputStream,这将在一小段数据上动态地进行URL编码

它可能是这样的(部分代码,您必须填充它才能编译):

通过使用Tomasz Nurkiewicz发布的encode()方法,您还可以(根据您的用例)避免将整个文件一次加载到内存中:

现在您已经准备好了所有内容,因此可以调用它:

UrlEncOutputStream out = new UrlEncOutputStream("OUT.txt");
encode(new File("SOURCE.IMG"), out);
希望这有帮助



编辑:为了让这段代码正常工作,您的类路径中需要有commons编解码器和commons io。

这基本上太大了@MattBall那么我如何在OutputStream上写这个,实际上我必须写URLEncode字符串。你能提出一些建议吗?在URL中发送的数据量实在太大了。为什么不将原始字节发布到服务器?
public static class UrlEncOutputStream extends FileOutputStream {

    /* Implement constructors here */

    @Override
    public void write (byte [] b, int off, int len)  throws IOException {
            String s = StringUtils.newStringUsAscii(b);
            super.write(URLEncoder.encode(s, "UTF-8").getBytes());
    }

    /* Implement write(byte [] b) and write(int b) in similar fashion */
}
public void encode(File file, OutputStream base64OutputStream) {
  InputStream is = new FileInputStream(file);
  OutputStream out = new Base64OutputStream(base64OutputStream)
  IOUtils.copy(is, out);
  is.close();
  out.close();
}
UrlEncOutputStream out = new UrlEncOutputStream("OUT.txt");
encode(new File("SOURCE.IMG"), out);