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

我从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的仿真器和设备上。

我该怎么办?

一次读一个字节就是1990年代。 要么使用HttpClient和BasicResponseHandler ,要么至少读取可敬的块中的数据并使用StringBuilder附加它们。

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

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

您可以尝试使用创建新的JSONObject

 new JSONObject(new JSONTokener(in)) 

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