【问题标题】:How to read a large json from a text file in android app?如何从android应用程序中的文本文件中读取一个大的json?
【发布时间】:2015-01-29 14:32:57
【问题描述】:

我的 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 字节”。我在这里搜索并尝试了不同的解决方案,但没有成功。知道我应该如何解决这个问题。提前致谢。

【问题讨论】:

  • 我可以推荐使用 gson
  • 我认为您已经超出了应用程序专用的堆大小,请查看下面的 Suvitruf 答案。
  • 是否有任何样本

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-03-16
      • 2017-02-02
      • 2018-01-03
      • 1970-01-01
      • 1970-01-01
      • 2014-01-10
      • 1970-01-01
      • 1970-01-01
      • 2011-11-17
      相关资源
      最近更新 更多