首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android StringBuilder因XML文件过大而内存不足

Android StringBuilder因XML文件过大而内存不足
EN

Stack Overflow用户
提问于 2012-05-16 22:59:42
回答 2查看 1.4K关注 0票数 1

我在android设备上使用soap服务,作为响应,我从服务器获得了7mb的文件。这会导致我的应用程序崩溃,在将输入流转换为字符串时出现内存不足错误。MemoryAnalyzer显示内存已分配给StreamBuilder。处理这么大的回复最好的方法是什么?

代码语言:javascript
复制
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();
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-16 23:06:25

最明显的答案是使用流,并在结果到来时对其进行解析。如果您正在解析的是XML文件,那么SAX可能是最适合您的方法。

票数 1
EN

Stack Overflow用户

发布于 2014-08-12 14:57:59

StringBuilder需要的内存是其在扩展时拥有的数据的两倍。将分配一个新的、更大的(几乎可以肯定大于所需的)字符数组,并创建一个副本,然后才能丢弃旧的数组。

将所有行收集到更便宜的ArrayList<String>中,每行只有一个字符串引用的大小。读完之后,您可以在循环中计算确切的长度,并分配所需大小的StringBuilder。首先关闭流。或者,您可以直接重用列表,而无需转换为字符串。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10621261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档