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

问题描述 投票:8回答:3

我使用BufferedReader的lines()方法来计算行号是一个问题。以下是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?提前致谢。

java lambda bufferedreader java-8
3个回答
18
投票

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

当你做一个count()时,整个流都被读取,所以BufferedReader()可能 - 最后。 lines()的第二次调用将返回一个不读取任何行的流,因为读取器已经在其数据的末尾。

BufferedReader.lines()的javadoc指定:

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

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

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


3
投票

来自Javadoc

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

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


3
投票

java 8 API指定了here

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.