如何从Android应用程序中的文本文件中读取大型json?

时间:2014-12-01 14:45:56

标签: java android inputstream fileinputstream android-developer-api

我的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字节分配”。我在这里搜索并尝试了不同的解决方案,但没有使它工作。任何想法我应该如何解决这个问题。提前谢谢。

2 个答案:

答案 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标签,你也可以减少存储空间。