2016-05-16 20 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