【发布时间】:2013-08-31 16:53:03
【问题描述】:
我的应用正在解析大型 http 响应,http 响应超过 6 兆字节并且是 json,但不是标准架构。
final char[] buffer = new char[0x10000];
StringBuilder out = new StringBuilder();
Reader in = new InputStreamReader(is, "UTF-8");
int read;
System.gc();
do
{
read = in.read(buffer, 0, buffer.length);
if (read > 0)
{
out.append(buffer, 0, read);
}
} while (read >= 0);
in.close();
is.close();
in = null;
is = null;
System.gc();
return out.toString();
无论是否有来自文件的缓冲读取器或输入流,StringBuilder 根本无法包含整个对象并且它在out.append(buffer, 0, read); 处失败,或者它将在out.toString() 处失败,因为可能会制作另一个副本
来自 apache 库的IOUtils.copy 在后台做同样的事情,它也会失败。
如何读取这个大对象以进行进一步操作。目前,此方法在 Android 2.2 和 2.3 设备上失败,并且在较新的设备上使用的内存比我想要的要多。
类似的问题都有答案,包括附加到字符串生成器、逐行阅读,或者只有提示的不完整解决方案,这不起作用。
【问题讨论】:
标签: java android heap-memory inputstream stringbuilder