繁体   English   中英

使用BufferedReader从文件读取一组行

[英]Read a set of lines from a file using BufferedReader

嗨,我有一个大约1.6 GB的大型csv文件,我正在尝试读取该文件并创建这些行的json数组,并将其发送给其他消耗品流程。

我有以下代码

while(consumeover){
    try (BufferedReader br = new BufferedReader(new FileReader
                                ("/my/path/largefile"),65536)) {
         for (String line; (line = br.readLine()) != null;) {
         String[] dataRow = line.split("\\|");
         //create json array
         //add each dataRow element to array  
         }
    }
   }

现在发生的是上面的代码读取整个文件并创建json数组,该数组抛出内存不足错误。 我想每次我创建json数组时都要读取1000行。 如何将上次读取位置设置为i + 1000? 由于文件非常大,由于创建了数据数组,Java耗尽了内存。

请提前指导谢谢。

简单的解决方案是在获取时输出每行(而不是将其保存在数组中,然后发送/写入),或者在获取时每输出1000行。 这样,您只需要一次性读取文件。 您在内存中保留的行越少,您使用的内存就越少。

注意:从N行读取数据的唯一方法是读取N行并忽略它们。 随着文件变大,这将变得越来越昂贵。

假设您有一种将CSV线转换为JSon的方法。

try(BufferedReader br = new BufferedReader(new FileReader(infile));
    PrintWriter bw = new PrintWriter(new FileWriter(outfile))) {
    for(String line; (line = br.readLine()) != null;) {
        String json = process(line);
        bw.println(json);
    }
}

不管文件有多大,这仅需要足够的内存来存储一行CSV和一行JSON。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM