我想使用URLEncoder.encode对Base64编码的字符串进行编码,此字符串包含图像,它可以是任意大小(1MB-8MB)。
String imageDataToUpload = URLEncoder.encode(temp, "UTF-8");
02-27 02:41:45.213: D/dalvikvm(18600): GC_FOR_ALLOC freed 1824K, 12% free 26452K/29831K, paused 161ms
02-27 02:41:45.213: I/dalvikvm-heap(18600): Forcing collection of SoftReferences for 2968580-byte allocation
02-27 02:41:45.383: D/dalvikvm(18600): GC_BEFORE_OOM freed 9K, 12% free 26443K/29831K, paused 138ms
02-27 02:41:45.383: E/dalvikvm-heap(18600): Out of memory on a 2968580-byte allocation.
即使我在块中尝试了这个东西但是然后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();
}
答案 0 :(得分:0)
你能把它一块一块地写到一个文件而不是存储在内存中吗?否则,在应用程序的其他位置使用更少的内存(释放一些大变量)。
答案 1 :(得分:0)
假设(正如其他人已经指出的那样,我同意)这是一个内存问题,如果我是你,我会实现自定义的OutputStream,它会在一小段数据上动态地进行URLEncoding。
它可能看起来像这样(部分代码,你必须填写它才能编译):
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 */
}
您也可以(根据您的使用案例)使用Tomasz Nurkiewicz here发布的encode()方法,立即将整个文件加载到内存中:
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);
希望这有帮助!
编辑:为了使此代码正常工作,您需要在类路径中使用commons-codec和commons-io。