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