android java没有足够的顺序内存用于stringbuilder

android java没有足够的顺序内存用于stringbuilder,java,android,heap,inputstream,stringbuilder,Java,Android,Heap,Inputstream,Stringbuilder,我的应用程序正在解析一个大型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(); d

我的应用程序正在解析一个大型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();
无论文件中是否有bufferedreader或inputstream,StringBuilder都无法包含整个对象,并且在
out.append(buffer,0,read)时失败
或它将在
out.toString()失败,因为可能会制作另一个副本

apache库中的
IOUtils.copy
正在做同样的事情,它也会失败

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


类似的问题都有答案,包括附加到stringbuilder、逐行阅读,或者有不完整的解决方案,这些解决方案只是提示,不起作用。

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

  • 从服务器获取多个较小的JSON响应并解析这些响应。这在移动设备上可能更可取,因为大块数据可能无法可靠传输,这将导致设备重复请求整个内容
  • 使用流式JSON解析器,例如,在数据进入时处理数据

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

  • 从服务器获取多个较小的JSON响应并解析这些响应。这在移动设备上可能更可取,因为大块数据可能无法可靠传输,这将导致设备重复请求整个内容
  • 使用流式JSON解析器,例如,在数据进入时处理数据

  • 嗯,关于使用Jackson,这需要我重写整个应用程序中使用的httpget方法。第二,这是否意味着对于这个api调用,我需要一个声明了每个变量的对象?它有嵌套对象toowell Jackson在同一地点崩溃实际上是“java.lang.StringBuilder.toString(StringBuilder.java:663)”,因为它似乎也在内部使用string builder!hmI与GSON合作,感谢您为我指明了流式解析器的正确方向HM,关于使用Jackson,这需要我重写整个应用程序中使用的整个httpget方法。第二,这是否意味着对于这个api调用,我需要一个声明了每个变量的对象?它有嵌套对象toowell Jackson在同一地点崩溃实际上是“java.lang.StringBuilder.toString(StringBuilder.java:663)”,因为它似乎也在内部使用string builder!hmI与GSON一起使用,感谢您为我指明了流式解析器的正确方向