1

我的应用程序正在解析一个大的 http 响应,http 响应超过 6 兆字节并且是 json,但不是标准模式。

        final char[] buffer = new char[0x10000];
        StringBuilder out = new StringBuilder();
        Reader in = new InputStreamReader(is, "UTF-8");
        int read;
        System.gc();
        do
        {
            read = in.read(buffer, 0, buffer.length);
            if (read > 0)
            {
                out.append(buffer, 0, read);
            }
        } while (read >= 0);
        in.close();
        is.close();
        in = null;
        is = null;
        System.gc();
        return out.toString();

文件中是否有缓冲读取器或输入流无关紧要,StringBuilder 根本无法包含整个对象,它会失败,out.append(buffer, 0, read);或者它将失败,out.toString()因为可能会制作另一个副本

IOUtils.copy来自 apache 库的在幕后做同样的事情,它也会失败。

如何读取这个大对象以进行进一步操作。目前,这种方法在 Android 2.2 和 2.3 设备上失败,并且在较新的设备上使用的内存比我想要的要多。

类似的问题都有涉及附加到字符串生成器、逐行阅读或仅作为提示的不完整解决方案的答案,这不起作用。

4

1 回答 1

4

您需要做以下两件事之一:

  1. 从服务器获取多个较小的 JSON 响应并解析它们。这在移动设备上可能更可取,因为可能无法可靠地传输大块数据,这将导致设备重复请求整个数据。
  2. 使用流式 JSON 解析器(例如Jackson)来处理传入的数据。
于 2013-08-28T14:41:42.387 回答