我遇到了使用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
?提前谢谢。
答案 0 :(得分:18)
BufferedReader.lines()
方法返回一个流。访问流(例如,当您对其执行count()
时)将从缓冲区读取行,移动BufferedReader
向前的当前位置。
当您执行count()
时,将读取整个流,因此BufferedReader()
可能 - 可能 - 结束。第二次调用lines()
将返回一个不读取任何行的流,因为读者已经在其数据的末尾。
BufferedReader.lines()
的javadoc指定:
在执行终端流操作之后,不能保证读取器将处于从中读取下一个字符或行的特定位置。
我读到这意味着不能保证它紧接在从流返回的最后一行之后,但是当计数消耗所有行时,我很确定它在最后。回到读者的开头(通常)是不可能的。
如果您需要对BufferedReader.lines()
中的数据执行多项操作,则需要处理一次流式传输,或者需要将数据收集到临时存储中。但请注意,执行终端操作(如行数(或收集))可能永远不会完成(例如,如果BufferedReader
来自无限来源)。
答案 1 :(得分:3)
答案 2 :(得分:3)
java 8 API指定了here
执行终端流操作后,无法保证读者将处于读取下一个字符或行的特定位置。
因此,在执行br.lines().count()
语句后,指针的位置无法保证。
lines().count()
调用会消耗文件中的数据,并在不关闭流时再次调用。它不能通过调用br.lines().count()
再次使用相同的数据。