java - 如何从android应用程序中的文本文件中读取大的json?

标签 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();

实际情况下,Size int 为 20949874。循环完成后,即使我更改 for 循环的范围, stringBuilder 长度也始终为 11264 。我尝试在不使用循环的情况下从 InputStream 创建一个字符串,但它总是给我 OutOfMemoryError 异常。我还在日志中看到“将堆( fragment 情况)增长到 26.668MB,分配 20949890 字节”。我在这里搜索并尝试了不同的解决方案,但没有成功。知道我应该如何解决这个问题。提前致谢。

最佳答案

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

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

关于java - 如何从android应用程序中的文本文件中读取大的json?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27230896/

相关文章:

java - 使用 JCL 找不到提供程序 com.bea.xml.stream.MXParserFactory

java - 没有获得 gridview 图像的正确路径

机器人 : html loaded without font

带有 Soundcloud 流重定向的 Android MediaPlayer

java - JBoss AS 5.1 下分页 JPA 查询的内存泄漏

java - Gson、解析json内部类列表、javabean

java - 我可以在 Java Swing JDialog 框上设置一个计时器在几毫秒后关闭吗

c++ - 将原始类型的值从标准输入读入变量

android - SocketException:权限被拒绝?

java - 在 Java 6 中将 InputStream 写入文件的有效方法