Ich möchte eine Textdatei lesen, die durch Leerzeichen getrennte Werte enthält. Werte sind ganze Zahlen. Wie kann ich es lesen und in eine Array-Liste aufnehmen?
Hier ist ein Beispiel für den Inhalt der Textdatei:
1 62 4 55 5 6 77
Ich möchte es in einer Arrayliste haben als [1, 62, 4, 55, 5, 6, 77]
. Wie kann ich das in Java machen?
In Java 1.5 wurde die Scanner- Klasse für die Verarbeitung von Eingaben aus Dateien und Streams eingeführt.
Es wird zum Abrufen von Ganzzahlen aus einer Datei verwendet und sieht ungefähr so aus:
Überprüfen Sie jedoch die API. Es gibt viel mehr Optionen für den Umgang mit verschiedenen Arten von Eingabequellen, unterschiedlichen Trennzeichen und unterschiedlichen Datentypen.
quelle
Dieser Beispielcode zeigt Ihnen, wie Sie Dateien in Java lesen.
quelle
Schauen Sie sich dieses Beispiel an und versuchen Sie, Ihr eigenes zu machen:
quelle
Nur zum Spaß, hier ist, was ich wahrscheinlich in einem echten Projekt tun würde, in dem ich bereits alle meine Lieblingsbibliotheken verwende (in diesem Fall Guava , früher bekannt als Google Collections ).
Vorteil: Nicht viel eigener Code zu erhalten (Gegensatz zu zB diesen ). Bearbeiten : Obwohl es erwähnenswert ist, dass in diesem Fall die Scanner-Lösung von tschaible keinen Code mehr enthält!
Nachteil: Möglicherweise möchten Sie nicht nur dafür neue Bibliotheksabhängigkeiten hinzufügen. (Andererseits wäre es dumm, Guava in Ihren Projekten nicht zu verwenden. ;-)
quelle
Verwenden Sie Apache Commons (IO und Lang) für einfache / allgemeine Dinge wie diese.
Importe:
Code:
Getan.
quelle
Verwenden von Java 7 zum Lesen von Dateien mit NIO.2
Importieren Sie diese Pakete:
Dies ist der Vorgang zum Lesen einer Datei:
So lesen Sie alle Zeilen einer Datei gleichzeitig:
quelle
Alle bisher gegebenen Antworten beinhalten das zeilenweise Lesen der Datei, das Aufnehmen der Zeile als
String
und das anschließende Verarbeiten derString
.Es steht außer Frage, dass dies der am einfachsten zu verstehende Ansatz ist. Wenn die Datei ziemlich kurz ist (z. B. Zehntausende von Zeilen), ist sie auch im Hinblick auf die Effizienz akzeptabel. Wenn die Datei jedoch lang ist , ist dies aus zwei Gründen eine sehr ineffiziente Methode:
String
und einmal beim Verarbeiten.String
für jede Zeile eine neue und werfen sie dann weg, wenn Sie zur nächsten Zeile wechseln. Der Garbage Collector muss schließlich alle dieseString
Objekte entsorgen , die Sie nicht mehr benötigen. Jemand muss nach dir aufräumen.Wenn Sie Wert auf Geschwindigkeit legen, ist es viel besser, einen Datenblock zu lesen und ihn dann byteweise zu verarbeiten, als zeilenweise. Jedes Mal , wenn Sie an das Ende einer Reihe kommen, fügen Sie es auf die
List
Sie bauen.Es wird ungefähr so herauskommen:
Der obige Code geht davon aus, dass dies ASCII ist (obwohl es für andere Codierungen leicht angepasst werden kann) und dass alles, was keine Ziffer ist (insbesondere ein Leerzeichen oder eine neue Zeile), eine Grenze zwischen Ziffern darstellt. Es wird auch davon ausgegangen, dass die Datei mit einer Nicht-Ziffer endet (in der Praxis endet die letzte Zeile mit einer neuen Zeile). Sie kann jedoch erneut angepasst werden, um den Fall zu behandeln, in dem dies nicht der Fall ist.
Es ist viel, viel schneller als jeder der
String
basierten Ansätze, die auch als Antwort auf diese Frage gegeben werden. Es gibt eine detaillierte Untersuchung eines sehr ähnlichen Themas in dieser Frage . Sie werden dort sehen, dass es die Möglichkeit gibt, es noch weiter zu verbessern, wenn Sie die Multithread-Linie durchlaufen möchten.quelle
Lesen Sie die Datei und machen Sie dann, was Sie wollen. java8 Files.lines (Paths.get ("c: //lines.txt")). collect (Collectors.toList ());
quelle