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

标签 java android string out-of-memory

我从 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/

相关文章:

java - Spring Boot Web应用程序错误: No mapping found for HTTP request with URI [/] in DispatcherServlet with name 'dispatcherServlet'

java - Java 世界中有类似 WPF 和 MVVM 的东西吗?

android - 设置默认时区以用于 Android 应用程序

c - 字符串没有填充随机字符(C)?

c - 在 C 中替换字符串中的字符并随后取消替换的最佳方法

java - 有条件的自动化网络交互

Java HashMap 到矩阵

android - 如何让一个按钮一天只能点击一次

android - Android多列ListView

string - Lua中将字符串分割成二维表