我从 Web 服务接收 gzip 后的 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
,要么至少使用 read the data in respectable chunks并使用 StringBuilder
附加它们。
假设您仍然遇到问题,问题是没有单个内存块足以容纳您的字符串,基于您的应用程序一直在做的其他事情。 Android 垃圾收集器不是压缩收集器,因此可能有大量可用堆空间但不足以满足特定的分配请求。
在这种情况下,您可能需要切换到某种流式 JSON 解析器。如果您碰巧只针对 Honeycomb 或更高版本,您可以使用 JSONReader
.否则,Jackson据报道可以在 Android 上运行,并且显然具有流媒体模式。
关于java - 将大型 JSON (InputStream) 放入 String 时出现内存不足错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5842201/