android java没有足够的顺序内存用于stringbuilder
我的应用程序正在解析一个大型http响应,http响应超过6兆字节,是json,但不是标准模式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
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一起使用,感谢您为我指明了流式解析器的正确方向