Java 8 BufferedReader lines()方法打印不同的计数

时间:2014-05-09 11:59:41

标签: java lambda bufferedreader java-8

我遇到了使用BufferedReader的line()方法计算行号的问题。以下是test.txt文件的内容。

1 Career
2 Filmography
3 Awards
4 References
5 External

以下是两次计算行号的源代码。

  BufferedReader br=new BufferedReader(new FileReader(new File("test.txt")));
  long lineNo=br.lines().count();
  long lineNo2=br.lines().count();

  System.out.println(lineNo); // 5
  System.out.println(lineNo2);// 0

在此,我有疑问为什么第二行lineNo2打印0而不是5?提前谢谢。

3 个答案:

答案 0 :(得分:18)

BufferedReader.lines()方法返回一个流。访问流(例如,当您对其执行count()时)将从缓冲区读取行,移动BufferedReader向前的当前位置。

当您执行count()时,将读取整个流,因此BufferedReader()可能 - 可能 - 结束。第二次调用lines()将返回一个不读取任何行的流,因为读者已经在其数据的末尾。

BufferedReader.lines()的javadoc指定:

  

在执行终端流操作之后,不能保证读取器将处于从中读取下一个字符或行的特定位置。

我读到这意味着不能保证它紧接在从流返回的最后一行之后,但是当计数消耗所有行时,我很确定它在最后。回到读者的开头(通常)是不可能的。

如果您需要对BufferedReader.lines()中的数据执行多项操作,则需要处理一次流式传输,或者需要将数据收集到临时存储中。但请注意,执行终端操作(如行数(或收集))可能永远不会完成(例如,如果BufferedReader来自无限来源)。

答案 1 :(得分:3)

来自Javadoc

  

执行终端流操作后没有   保证读者将处于特定的位置   阅读下一个字符或行。

count()是终端操作。因此,在第一次count() - 调用之后,未指定读者的位置。

答案 2 :(得分:3)

java 8 API指定了here

  

执行终端流操作后,无法保证读者将处于读取下一个字符或行的特定位置。

因此,在执行br.lines().count()语句后,指针的位置无法保证。

lines().count()调用会消耗文件中的数据,并在不关闭流时再次调用。它不能通过调用br.lines().count()再次使用相同的数据。