使用BufferedReader从文件中读取一组行

时间:2014-07-19 08:46:21

标签: java file-io nio

您好我有一个大约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  
         }
    }
   }

现在发生的事情是上面的代码读取整个文件并创建了抛出Out of Memory错误的json数组。我想在每次创建json数组时读取一行代表1000行。如何将我的上次阅读位置设置为i + 1000?由于文件非常庞大,由于数据数组被创建,Java会因内存不足而丢失。

请提前指导谢谢。

1 个答案:

答案 0 :(得分:1)

简单的解决方案是在获得它时输出每一行(不将其保存在数组中然后发送/写入),或者在获得它们时每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的足够内存。