所以我的想法是我需要读取这个.json文件。它太大了,我甚至不能用记事本或visualstudio代码打开它。
我试过这个:
BufferedReader in = new BufferedReader(new FileReader("path to the file"));
String line = in.readLine();
我得到一个错误:
线程“main”java.lang.outofmemoryerror中出现异常:java.base/java.util.arrays.copyof(arrays)处的java堆空间。java:3536)位于java.base/java.lang.abstractstringbuilder.ensurecapacityinternal(abstractstringbuilder)。java:228)在java.base/java.lang.abstractstringbuilder.append(abstractstringbuilder。java:735)在java.base/java.lang.stringbuilder.append(stringbuilder。java:227)在java.base/java.io.bufferedreader.readline(bufferedreader。java:372)在java.base/java.io.bufferedreader.readline(bufferedreader。java:392)在com.readjson.tagvalues.listfilesforfolder(tagvalues。java:133)在com.readjson.tagvalues.listfilesforfolder(tagvalues。java:129)在com.readjson.tagvalues.listfilesforfolder(tagvalues。java:129)在com.readjson.tagvalues.listfilesforfolder(tagvalues。java:129)在com.readjson.main.main(main。java:18)
我在互联网上搜索了一些解决方案是改变内存设置,但它不工作,它返回相同的错误。另一个问题是整个文件是一行的。文件的全部内容都写在一行中。我想我必须在某个特定的时间中断行的读取部分,这样它就不会超过分配的最大内存,存储该值并从我离开的地方重新开始读取。一次又一次地这样做直到队伍的尽头。
我该怎么看这个文件有什么建议吗?我应该尝试另一种方式来阅读它,还是有什么诀窍可以打破readline()?
谢谢!
3条答案
按热度按时间ukdjmx9f1#
您可以查看dsm流媒体库。您可以在解析json文档时对其进行处理。您可以在yaml中为要处理的数据定义Map。它基于Map文件处理json文档。dsm使用jackson流api。
你可以在这个问题上举个例子
java—解析巨大(超大)json文件的最佳方法
e0bqpujr2#
尽管您可以增加jvm内存限制,但这是不必要的,而且需要分配1gb这样的巨大内存来处理文件,这样会造成过度杀戮和资源密集。
这样你就可以一件一件地读了。
kcwpcxri3#
对于如此庞大的json文件,不应该将整个jsondom(文档对象模型)读入内存。但是使用流解析器。
带readline的bufferedreader无论如何都是错误的,如果只有一个巨大的行。json文件通常采用ut-8编码。
FileReader
是一个使用默认字符编码的旧实用程序类:not portable code,wrong。有一个Jackson流api。对于使用maven的项目:
代码类似于:
用于提取部分数据,或将数据存储在数据库中。