如何使用Java逐行读取大型文本文件?

问题

我需要使用Java逐行读取大约5-6 GB的大文本文件。

我怎么能快点做到这一点?


#1 热门回答(849 赞)

一种常见的模式是使用

try (BufferedReader br = new BufferedReader(new FileReader(file))) {
    String line;
    while ((line = br.readLine()) != null) {
       // process the line.
    }
}

如果假设没有字符编码,则可以更快地读取数据。例如ASCII-7但它没有太大的区别。你对数据的处理很可能需要更长的时间。

编辑:一种不常用的模式,避免了“线”泄漏的范围。

try(BufferedReader br = new BufferedReader(new FileReader(file))) {
    for(String line; (line = br.readLine()) != null; ) {
        // process the line.
    }
    // line is not visible here.
}

更新:在Java 8中你可以做到

try (Stream<String> stream = Files.lines(Paths.get(fileName))) {
        stream.forEach(System.out::println);
}

注意:你必须将Stream放在try-with-resource块中以确保在其上调用#close方法,否则在GC稍后执行它之前,基础文件句柄永远不会关闭。


#2 热门回答(119 赞)

看看这个博客:

  • Java逐行读取文件 - Java教程

可以指定缓冲区大小,也可以使用默认大小。对于大多数用途,默认值足够大。

// Open the file
FileInputStream fstream = new FileInputStream("textfile.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));

String strLine;

//Read File Line By Line
while ((strLine = br.readLine()) != null)   {
  // Print the content on the console
  System.out.println (strLine);
}

//Close the input stream
br.close();

#3 热门回答(76 赞)

Oncejava-8出局(2014年3月),你将能够使用流:

try (Stream<String> lines = Files.lines(Paths.get(filename), Charset.defaultCharset())) {
  lines.forEachOrdered(line -> process(line));
}

打印文件中的所有行:

try (Stream<String> lines = Files.lines(file, Charset.defaultCharset())) {
  lines.forEachOrdered(System.out::println);
}