0

У меня есть текстовый файл в моем приложении для Android, который состоит из json. Мне нужно прочитать и разобрать это json. Размер файла: 21 МБ. Я использую следующий код для чтения файла:Как читать большой json из текстового файла в приложении для Android?

StringBuilder stringBuilder = new StringBuilder(); 
InputStream input = getAssets().open(filename); 
int size = input.available(); 
byte[] buffer = new byte[size]; 
byte[] tempBuffer = new byte[1024]; 
int tempBufferIndex = 0; 
for(int i=0; i<size; i++){ 
    if(i == 0){ 
     tempBuffer[tempBufferIndex] = buffer[i]; 
    }else{ 
     int mod = 1024 % i; 
     if(mod == 0){ 
      input.read(tempBuffer); 
      stringBuilder.append(new String(tempBuffer)); 
      tempBufferIndex = 0; 
     } 
     tempBuffer[tempBufferIndex] = buffer[i]; 
    } 
} 
input.close(); 

Размер int 20949874 в реальном случае. После цикла цикл stringBuilder length всегда 11264, даже если я изменяю диапазон для цикла. Я попытался сделать одну строку из InputStream без использования цикла, но он всегда дает мне OutOfMemoryError Exception. Я также получаю «Grow heap (frag case) до 26.668MB для выделения 20949890 байтов» в моих журналах. Я искал здесь и пробовал разные решения, но не работал. Любая идея, как я должен решить эту проблему. Заранее спасибо.

+0

Я могу порекомендовать использовать gson – wvdz

+0

Я думаю, что вы превысили размер кучи, выделенный для приложения, проверьте ниже ответ Suvitruf. – Yazan

ответ

2

Для больших файлов json вы должны использовать SAX-парсер, а не DOM. Например, JsonReader.

DOM («Объектная модель документа») загружает весь контент в память и позволяет разработчику запрашивать данные по своему усмотрению. SAX представляет данные в виде потока: разработчик ждет появления желаемых фрагментов данных и сохраняет только те детали, которые им нужны. DOM считается более простым в использовании, но SAX использует гораздо меньше памяти.

2

Вы можете попытаться разбить файл на несколько частей. Так что во время обработки приложение, надеюсь, не выходит из памяти.

Вы должны также рассмотреть возможность использования флага «largeHeap» в манифесте (см http://developer.android.com/guide/topics/manifest/application-element.html)

Я не знаю, ваш файл, но может быть, если вы используете меньшие теги JSON, вы можете уменьшить хранения, а также.

Смежные вопросы