我的Android应用程序中有一个文本文件,其中包含一个json。我需要阅读并解析那个json。文件大小为21 MB。我使用以下代码来读取文件:
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。循环完成后,即使我改变for循环的范围,stringBuilder的长度也总是11264。我尝试从InputStream创建一个String而不使用循环,但它总是给我OutOfMemoryError异常。在我的日志中,我还得到“将堆积(frag case)增加到26.668MB,用于20949890字节分配”。我在这里搜索并尝试了不同的解决方案,但没有使它工作。任何想法我应该如何解决这个问题。提前谢谢。
答案 0 :(得分:2)
对于大json文件,您应该使用SAX解析器而不是DOM。例如JsonReader。
DOM (“文档对象模型”)将整个内容加载到内存中,并允许开发人员按照自己的意愿查询数据。 SAX 将数据显示为流:开发人员等待显示所需的数据并仅保存他们需要的部分。 DOM被认为更容易使用,但SAX使用的内存要少得多。
答案 1 :(得分:2)
您可以尝试将文件拆分为多个部分。 所以在处理期间,应用程序希望不会内存不足。
你还应该考虑使用&#34; largeHeap&#34;你的清单中的标志 (见http://developer.android.com/guide/topics/manifest/application-element.html)
我不知道你的文件,但是如果你使用较小的JSON标签,你也可以减少存储空间。