Мое приложение анализирует большой ответ http, ответ HTTP составляет более 6 мегабайт и является json, но не в стандартной схеме.android java недостаточно последовательной памяти для stringbuilder
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()
, как другая копия может быть сделана
IOUtils.copy
из библиотеки apache делает то же самое под капотом, и он также потерпит неудачу.
Как я могу прочитать этот большой объект для дальнейших манипуляций. В настоящий момент этот метод не работает на устройствах Android 2.2 и 2.3 и использует больше памяти, чем я, на более новых устройствах.
У похожих вопросов есть ответы, связанные с добавлением строкового редактора, чтением в строках или неполными решениями, которые являются только намеками, и это не работает.
гм, что касается использования Джексона, это потребовало бы мне переписать весь мой метод HttpGet, который используется по всему приложению , А во-вторых, это означает, что для этого одного вызова api мне понадобится объект с объявленной каждой переменной? У него есть вложенные объекты тоже – CQM
хорошо, что Джексон падает на том же месте на самом деле «java.lang.StringBuilder.toString (StringBuilder.java:663)», потому что он тоже использует встроенный построитель строк! hm – CQM
Опубликовать свой код - вы используете потоковый API Jackson? – 323go