![](/img/trans.png)
[英]StringBuilder out of memory error when working with large strings in java
[英]Android StringBuilder out of memory with large XML file
我在Android设备上使用了肥皂服务,并且作为响应,我从服务器获取了7mb文件。 将输入流转换为字符串时,这会导致我的应用崩溃并出现内存不足错误。 MemoryAnalyzer显示内存已分配给StreamBuilder。 处理如此巨大反应的最佳方法是什么?
HttpEntity entity = new StringEntity(soap.toString());
httppost.setEntity(entity);
HttpResponse response = httpclient.execute(httppost);
HttpEntity r_entity = response.getEntity();
if( r_entity != null ) {
result = inputStreamToString(r_entity.getContent());
}
...
//convert stream to string
public static String inputStreamToString(InputStream stream) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(stream));
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = br.readLine()) != null) {
sb.append(line + "\n");
}
br.close();
return sb.toString();
}
最明显的答案是使用流并解析结果。 如果您要解析的是XML文件,那么SAX可能是您的最佳途径。
StringBuilder
需要的内存是扩展时的两倍。 将分配一个新的,更大的(几乎肯定大于所需的)字符数组,并进行复制,然后才可以丢弃旧的数组。
将所有行收集到更便宜的ArrayList<String>
,每行只有String引用的大小。 阅读完之后,您可以在一个循环中计算确切的长度,并分配恰好需要的大小的StringBuilder。 首先关闭流。 或者,也许您可以直接重用列表,而无需转换为字符串。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.