1

我的 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 创建一个字符串,但它总是给我 OutOfMemoryError 异常。我还在我的日志中得到“将堆(碎片情况)增加到 26.668MB 以分配 20949890 字节”。我在这里搜索并尝试了不同的解决方案,但没有成功。知道我应该如何解决这个问题。提前致谢。

4

2 回答 2

2

对于大型 json 文件,您应该使用 SAX 解析器而不是 DOM。例如JsonReader

DOM(“文档对象模型”)将整个内容加载到内存中,并允许开发人员根据需要查询数据。 SAX将数据呈现为流:开发人员等待他们想要的数据片段出现并只保存他们需要的部分。DOM 被认为更易于使用,但 SAX 使用的内存要少得多。

于 2014-12-01T14:51:17.287 回答
2

您可以尝试将文件拆分为几个部分。因此,在处理应用程序期间,希望不会出现内存不足。

您还应该考虑在清单中使用“largeHeap”标志(参见http://developer.android.com/guide/topics/manifest/application-element.html

我不知道你的文件,但也许如果你使用较小的 JSON 标签,你也可以减少存储空间。

于 2014-12-01T14:58:51.050 回答