Was ist bei einer nicht zu langen Zeichenfolge der beste Weg, sie Zeile für Zeile zu lesen?
Ich weiß, dass Sie Folgendes tun können:
BufferedReader reader = new BufferedReader(new StringReader(<string>));
reader.readLine();
Ein anderer Weg wäre, den Teilstring auf das Äol zu nehmen:
final String eol = System.getProperty("line.separator");
output = output.substring(output.indexOf(eol + 1));
Gibt es noch andere, vielleicht einfachere Möglichkeiten? Ich habe keine Probleme mit den oben genannten Ansätzen. Ich bin nur daran interessiert zu wissen, ob einer von Ihnen etwas weiß, das einfacher und effizienter aussieht.
Antworten:
Sie können auch die
split
Methode von String verwenden:Dies gibt Ihnen alle Zeilen in einem praktischen Array.
Ich weiß nichts über die Leistung von Split. Es werden reguläre Ausdrücke verwendet.
quelle
line.separator
und jemand anderes sie unter Windows mit liestline.separator
, ist sie immer noch buckelig. Das sind keine inkompetenten Programmierer, die dumme Dinge tun, sondern nur, wie Dinge (nicht immer) funktionieren.Es gibt auch
Scanner
. Sie können es genauso verwenden wieBufferedReader
:Ich denke, dass dies ein etwas saubererer Ansatz ist als die beiden vorgeschlagenen.
quelle
Da ich mich besonders für den Effizienzwinkel interessierte, habe ich eine kleine Testklasse erstellt (siehe unten). Ergebnis für 5.000.000 Zeilen:
Wie üblich können die genauen Zeiten variieren, aber das Verhältnis gilt, wie oft ich es ausgeführt habe.
Fazit: Die "einfacheren" und "effizienteren" Anforderungen des OP können nicht gleichzeitig erfüllt werden, die
split
Lösung (in beiden Inkarnationen) ist einfacher, aber dieReader
Implementierung schlägt die anderen zweifellos.quelle
lines()
Funktion, die eineStream<String>
der Zeilen zurückgibt, die Sie auf Wunsch in einer Liste sammeln oder den Stream verarbeiten können.Mit Apache Commons IOUtils können Sie dies gut über tun
Es macht nichts Kluges, aber es ist schön und kompakt. Es wird auch Streams verarbeiten, und Sie können auch eine bekommen,
LineIterator
wenn Sie es vorziehen.quelle
IOUtils.readlines(Reader)
einIOException
. Auch wenn dies mit einem StringReader wahrscheinlich nie passieren wird, müssen Sie ihn abfangen oder deklarieren.Lösung mit
Java 8
Funktionen wieStream API
undMethod references
oder
quelle
Seit Java 11 gibt es eine neue Methode
String.lines
:Verwendung:
quelle
Sie können die Stream-API und einen StringReader verwenden, die in einen BufferedReader eingeschlossen sind, der in Java 8 eine line () -Stream-Ausgabe erhalten hat:
Gibt
Genau wie in der readLine von BufferedReader sind die Zeilenumbruchzeichen selbst nicht enthalten. Alle Arten von Zeilenumbrüchen werden unterstützt (sogar in derselben Zeichenfolge).
quelle
Sie können auch verwenden:
Wenn das nicht funktioniert, ersetzen Sie es
\n
durch\r\n
.quelle
Oder verwenden Sie die Klausel new try with resources in Kombination mit Scanner:
quelle
Sie können den folgenden regulären Ausdruck ausprobieren:
Code:
Ausgabe:
quelle
Der einfachste und universellste Ansatz wäre, nur den passenden regulären Ausdruck zu
Linebreak matcher
\R
verwendenAny Unicode linebreak sequence
:@see https://docs.oracle.com/de/java/javase/11/docs/api/java.base/java/util/regex/Pattern.html
quelle