将大型JSON(InputStream)放入字符串时出现内存不足错误如何解决?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (55)

我从Web服务收到gziped JSON,然后我解压缩它(非字节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的设备上。

我该怎么办?

提问于
用户回答回答于

在一次字节读是那么 1990年的。要么使用HttpClient BasicResponseHandler,要么至少读取可尊重的块中的数据并使用a追加它们StringBuilder

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

在这种情况下,可能需要切换到某种流式JSON解析器。如果碰巧只针对Honeycomb或更高版本,则可以使用JSONReader。否则,据报道jackson在Android上工作,显然有一个流模式。

用户回答回答于

你可以尝试使用创建一个新的JSONObject

new JSONObject(new JSONTokener(in)) 

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

扫码关注云+社区