2016-05-16 73 views
0

我正在使用BufferedReader lines()方法来获取文本文件中的特定行。下面是代码:意外的java.util.NoSuchElementException与BufferedReader

String line = reader.lines().filter(stuff -> stuff.startsWith(string)).findFirst().get(); // This is called inside of another method. 

它的工作原理的第一对夫妇的时候,我调用该方法,那么它只是给了我一个NoSuchElementException之后。我查看了文件,确实有一行以所需的string变量开头。

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

回答

3

A BufferedReader是不可重复使用的,因为它只能遍历文件,不能启动。当您上次拨打.lines()时,您已经阅读了整个文件,阅读器将被放置在文件的末尾。你可能不希望它已经达到了文件的末尾还没有,但作为每docs

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

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

+0

感谢您的解释,它完美运作。 – theTechnoKid

0

它可以在第一时间

所以,你已经阅读过的所有行。所以没有更多的线。所以你不能阅读它们。

+0

它工作的第一次几次。 – theTechnoKid

+0

@theTechopnoKid不,它仅适用于第一次。之后,你将不得不重新初始化'reader'。它不能自动倒带。 – EJP

+0

'.lines()'实际上并不读取所有的行。这是延迟填充,这意味着它只会读取码流操作中使用的码流。在这种情况下,他们做了'findFirst()',它将读取的文件短路,并在文件结束之前停止。但是,文档说这不能保证。 – 4castle