Java TXT Datei einlesen?

2 Antworten

der code liest stückchenweise die datei ein und der stringbuilder ist das objekt, dass den text der datei beinhaltet.

für mich sieht das fehlerhaft aus und ich denke nach einer zeile hört der auf die datei einzulesen

Woher ich das weiß:Berufserfahrung

Über ein RandomAccessFile-Objekt wird die Datei s.txt geöffnet und mit dem Dateizeiger an das Ende der Datei gesprungen (seek). Von dort aus wird (via Schleife) begonnen, ein Zeichen nach dem nächsten einzulesen (wohlgemerkt rückwärts), bis der erste Zeilenumbruch (\n) gefunden wird.

Jedes gelesene Zeichen wird dem StringBuilder-Objekt übergeben (append). Dieses sammelt diese Zeichen also nur bzw. merkt sich Zeichen in der Reihenfolge, in der man sie ihm übergibt.

Mittels toString-Methode könntest du anschließend alle gesammelten Zeichen zu einem String zusammenfügen:

String result = builder.toString();

Nun einmal angenommen, dies wäre der Inhalt der Textdatei:

Anglerfisch
Barrakuda
Goldbrasse
Thunfisch

Dann wäre das Ergebnis hcsifnuhT.


Heeeeeeeeeey 
Fragesteller
 23.01.2022, 11:16

Und wenn ich anschließen builder.reverse; schreibe, wäre das Ergebnis Thunfisch. Oder?

Ist das nicht richtig unnötig langer Code? Kann man das anders machen?

0
regex9  23.01.2022, 16:18
@Heeeeeeeeeey

Ja, genau.

Ja, man kann auch anders vorgehen.

List<String> lines = Files.readAllLines(Paths.get("file path ..."));
String lastLine = lines[lines.size() - 1];

Der Weg über das RandomAccessFile-Objekt war damals (vor Java 4; aufgrund der Möglichkeit, den Dateizeiger zu setzen) eine schnelle Lösung, zumal die seek-Implementation intern auf eine native Code-Implementation zurückgreift. Die später in das SDK eingeführten Implementationen aus dem nio-Package wiederum ermöglichen ein schnelleres Einlesen. Vor allem wenn du Dateien mit mehreren hunderttausend Zeilen lesen möchtest, sollten sie das Mittel der Wahl sein (oder ein klassischer BufferedReader). Eine Optimierung des obigen Snippets (hinsichtlich der Performance, aber nicht hinsichtlich der Länge) wäre sicherlich mit einem FileChannel machbar.

0