将大型JSON(InputStream)放入String时出现内存不足错误

时间:2011-04-30 13:55:49

标签: java android string out-of-memory

我从Web服务接收gziped JSON然后解压缩它(unziped JSON的大小是3.2MB)。 我需要将收到的InputStream转换为String,然后我可以创建JSONObject并解析它。我用这段代码做到了:

public static String InputStreamToString(InputStream in) 
    throws IOException {

    BufferedInputStream bis = new BufferedInputStream(in);
    ByteArrayOutputStream buf = new ByteArrayOutputStream();
    int result = bis.read();

    while(result != -1) {
      byte b = (byte)result;
      buf.write(b);
      result = bis.read();
    }        
    return buf.toString();
}

我在最后一行收到java.lang.OutOfMemoryError:“return buf.toString();”在288MB Ram的模拟器和设备上。

我该怎么办?

2 个答案:

答案 0 :(得分:8)

一次读取一个字节是所以 1990年。使用HttpClient和BasicResponseHandler,或者至少read the data in respectable chunks并使用StringBuilder附加它们。

假设您仍然遇到问题,问题是根据您的应用程序一直在做的其他事情,没有单个内存块足够大于您的字符串。 Android垃圾收集器不是压缩收集器,因此可能有大量的空闲堆空间,但不足以满足特定的分配请求。

在这种情况下,您可能需要切换到某种流式JSON解析器。如果您恰好只定位Honeycomb及更高版本,则可以使用JSONReader。否则,Jackson据称可以在Android上运行,并且显然具有流式传输模式。

答案 1 :(得分:1)

您可以尝试使用

创建新的JSONObject
new JSONObject(new JSONTokener(in)) 

而不是直接转换为String。但是,这可能只会延迟问题。如果你没有足够的内存来将3.2兆字节的字符串加载到内存中,你可能没有足够的内存来加载它作为一个json对象,这将占用比简单字符串更多的内存。