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

Java 使用BufferedReader从文件中读取一组行,java,file-io,nio,Java,File Io,Nio,您好,我有一个大约1.6GB的大型csv文件,我正在尝试读取该文件并创建这些行的json数组,然后将其发送到其他进程 我有以下代码 while(consumeover){ try (BufferedReader br = new BufferedReader(new FileReader ("/my/path/largefile"),65536)) { for (String line; (line = b

您好,我有一个大约1.6GB的大型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,无论文件有多大。

Hi@Peter非常感谢您的回答。它会扩展吗?因为我有非常大的文件1.6G是最小的一个。随机存取文件会有帮助吗?我是新的文件IO,所以不确定什么是最好的?为什么它不能扩展?你可以有一个1 TB的文件。我不知道NIO会有什么帮助。我无法理解您的方法。请您帮助我编写简单的代码。@user449355我添加了一个示例。非常感谢您提供的代码。示例代码中的outFile是什么?