2016-05-16 16 views
0

Ich verwende die BufferedReader lines() Methode, um eine bestimmte Zeile in einer Textdatei abzurufen. Hier ist der Code:Unerwartete java.util.NoSuchElementException mit BufferedReader

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

Es funktioniert die ersten paar Male, die ich die Methode aufrufen, dann nur es gibt mir eine NoSuchElementException hinterher. Ich habe mir die Datei angesehen und da ist tatsächlich eine Zeile, die mit der gewünschten string Variable beginnt.

Ich werde bei Bedarf weitere Informationen geben.

Antwort

3

Ein BufferedReader ist nicht wiederverwendbar, wie in, es kann nur die Datei durchlaufen, nicht nach oben. Wenn Sie das letzte Mal .lines() aufrufen, haben Sie die gesamte Datei gelesen, und der Leser wird am Ende der Datei positioniert. Sie können nicht erwarten das Ende der Datei noch nicht erreicht haben, aber nach der docs:

Nach der Ausführung der Terminals Stream-Operation gibt es keine Garantien, dass der Leser an einer bestimmten Position sein wird, von dem um das nächste Zeichen oder die nächste Zeile zu lesen.

Um .lines() zuverlässig wieder aufrufen, müssen Sie die BufferedReader wieder instanziiert. Wenn Sie das nächste Vorkommen in der Datei suchen möchten, verwenden Sie .skip(X).findFirst() für die nachfolgenden Aufrufe.

+0

Danke für die Erklärung, es hat perfekt funktioniert. – theTechnoKid

0

Es funktioniert das erste Mal

So haben Sie bereits alle Zeilen lesen. Es gibt also keine Linien mehr. Sie können sie also nicht lesen.

+0

Es funktioniert die ersten Male. – theTechnoKid

+0

@theTechopnoKid Nein, es funktioniert nur das erste Mal. Danach müssten Sie "Leser" neu initialisieren. Es kann nicht von selbst zurückspulen. – EJP

+0

'.lines()' liest nicht alle Zeilen. Es ist träge gefüllt, was bedeutet, dass es nur so viel lesen wird, wie der Stream in der Terminaloperation verwendet. In diesem Fall haben sie 'findFirst()' gefunden, was die gelesene Datei kurzschließt und vor dem Ende der Datei stoppt. Die Dokumentation sagt jedoch, dass dies nicht garantiert ist. – 4castle

Verwandte Themen