BufferedReader出现意外的java.util.NoSuchElementException

BufferedReader出现意外的java.util.NoSuchElementException,java,bufferedreader,java-stream,Java,Bufferedreader,Java Stream,我使用BufferedReaderlines()方法获取文本文件中的特定行。代码如下: String line = reader.lines().filter(stuff -> stuff.startsWith(string)).findFirst().get(); // This is called inside of another method. 它在我调用该方法的前几次有效,之后它只给我一个NoTouchElementException。我查看了文件,确实有一行以所需的字符串开始

我使用BufferedReader
lines()
方法获取文本文件中的特定行。代码如下:

String line = reader.lines().filter(stuff -> stuff.startsWith(string)).findFirst().get(); // This is called inside of another method.
它在我调用该方法的前几次有效,之后它只给我一个
NoTouchElementException
。我查看了文件,确实有一行以所需的
字符串开始

如果需要,我会提供更多的信息

它第一次起作用

你已经读过所有的台词了。所以没有更多的线了。所以你看不懂

它第一次起作用


你已经读过所有的台词了。所以没有更多的线了。因此您无法读取它们。

BufferedReader
是不可重用的,因为在中,它只能向下遍历文件,而不能向上遍历。上次调用
.lines()
时,您已经读取了整个文件,读取器将位于文件的末尾。您可能不希望它已经到达文件的末尾,但根据:

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


要再次可靠地调用
.lines()
,需要再次实例化
缓冲读取器。如果要查找文件中的下一个匹配项,请在后续调用中使用
.skip(X).findFirst()

A
BufferedReader
不可重用,如中所示,它只能向下遍历文件,不能向上遍历。上次调用
.lines()
时,您已经读取了整个文件,读取器将位于文件的末尾。您可能不希望它已经到达文件的末尾,但根据:

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


要再次可靠地调用
.lines()
,需要再次实例化
缓冲读取器。如果要查找文件中的下一个匹配项,请在后续调用中使用
.skip(X).findFirst()

@thetechpnokid No,它仅在第一次使用时有效。之后,您必须重新初始化
读卡器
。它不能自动倒带。
.lines()
实际上不会读取所有行。它是惰性填充的,这意味着它将只读取终端操作中流使用的数据量。在本例中,它们执行了
findFirst()
,这会使文件读取短路,并在文件结束之前停止。但是,文档说这并不能保证。@4castle我没有说过任何关于
lines()
@theTechopnoKid的事。不,它只在第一次起作用。之后,您必须重新初始化
读卡器
。它不能自动倒带。
.lines()
实际上不会读取所有行。它是惰性填充的,这意味着它将只读取终端操作中流使用的数据量。在本例中,它们执行了
findFirst()
,这会使文件读取短路,并在文件结束之前停止。但是,文档说这不是保证。@4castle我没有说过任何关于
lines()