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

Dix*_*ine 17 java string android 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();
}
Run Code Online (Sandbox Code Playgroud)

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

我该怎么办?

Com*_*are 8

在一次字节读是那么 1990年的.要么使用HttpClient BasicResponseHandler,要么至少以可敬的块读取数据并使用a附加它们StringBuilder.

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

在这种情况下,您可能需要切换到某种流式JSON解析器.如果您恰好只针对Honeycomb及更高版本,则可以使用JSONReader.否则,杰克逊据说可以在Android上工作,显然有一种流媒体模式.