java读取大文件

pokxtpni  于 2021-07-07  发布在  Java
关注(0)|答案(3)|浏览(412)

所以我的想法是我需要读取这个.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()?
谢谢!

ukdjmx9f

ukdjmx9f1#

您可以查看dsm流媒体库。您可以在解析json文档时对其进行处理。您可以在yaml中为要处理的数据定义Map。它基于Map文件处理json文档。dsm使用jackson流api。
你可以在这个问题上举个例子
java—解析巨大(超大)json文件的最佳方法

e0bqpujr

e0bqpujr2#

尽管您可以增加jvm内存限制,但这是不必要的,而且需要分配1gb这样的巨大内存来处理文件,这样会造成过度杀戮和资源密集。

InputStream inFileReader = channelSFtp.get(path); // file reading from ssh.
byte[] localbuffer = new byte[2048];

int i = 0;
while (-1 != (i = inFileReader.read(buffer))) {
    //Deal with the current read 2KB file chunk here
}

inFileReader.close();

这样你就可以一件一件地读了。

kcwpcxri

kcwpcxri3#

对于如此庞大的json文件,不应该将整个jsondom(文档对象模型)读入内存。但是使用流解析器。
带readline的bufferedreader无论如何都是错误的,如果只有一个巨大的行。json文件通常采用ut-8编码。 FileReader 是一个使用默认字符编码的旧实用程序类:not portable code,wrong。
有一个Jackson流api。对于使用maven的项目:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.11.3</version>
</dependency>

代码类似于:

JsonFactory factory = new JsonFactory();
try (JsonParser parser = jactory.createParser(...)) {
    while (parser.nextToken() != JsonToken.END_OBJECT) {
        String field = parser.getCurrentName();
        switch (field) {
        case "...":
            ...
            ... parser.getText();
            ... parser.getIntValue();
            break;
    }
}

用于提取部分数据,或将数据存储在数据库中。

相关问题