Wie lese ich eine große Textdatei Zeile für Zeile mit Java?
Ich Lesen müssen, eine große text-Datei von etwa 5-6 GB zeilenweise mit Java.
Wie kann ich das schnell?
Kommentar zu dem Problem
@kamaci et. al. Diese Frage sollte nicht als Duplikat gekennzeichnet sein. "Schnell zu Lesen, die Letzte Zeile" keine alternative, und fragwürdig, ob "der Schnellste Weg zum Lesen von text-Datei Zeile für Zeile" ist. Der Schnellste Weg, etwas zu tun, ist nicht unbedingt die gängige Art und Weise. Außerdem werden die Antworten unter die code enthalten, die relevante alternative, die Sie Liste nicht. Diese Frage ist hilfreich. Es ist derzeit der top-google-suchergebnis für "java Datei Lesen, Zeile für Zeile". Schließlich abtörnend ankommen, stack overflow und finde, dass 1 in jeden 2 Frage ist vorgemerkt für die Entsorgung.
Hier ist ein Vergleich der Geschwindigkeiten für die sechs möglichen Implementierungen.
Ereignis, obwohl habe ich gelesen, kommentiert und argumentiert, dass SO die engen politischen saugt, SO bleibt in ihm. Es ist so eine engstirnige Entwickler-Perspektive zu wollen, um Redundanz zu vermeiden um jeden Preis! Lass es einfach sein! Die Sahne steigt nach oben und der sh*t wird zu Boden sinken nur in Ordnung, ganz von selbst. Auch wenn Sie eine Frage haben können, wurde gebeten, vor (die Frage ist nicht??), das bedeutet nicht, dass eine neue Frage möglicherweise nicht in der Lage zu formulieren, besser zu werden, erhalten bessere Antworten, höheren Rang in den Suchmaschinen usw. Interessant, diese Frage ist jetzt 'geschützt'....
InformationsquelleAutor der Frage manoj singh | 2011-05-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einem gemeinsamen Muster zu verwenden
Lesen Sie die Daten schneller, wenn Sie annehmen, dass es keine Zeichencodierung. z.B. ASCII-7, aber es wird nicht viel Unterschied. Es ist sehr wahrscheinlich, dass das, was Sie mit den Daten tun wird viel länger dauern.
EDIT: EINE weniger häufige Muster zu verwenden, das verhindert den Umfang der
line
undicht.UPDATE: In Java 8, die Sie tun können
HINWEIS: Sie müssen den Strom in einem try-mit-Ressourcen-block, um sicherzustellen, die #close-Methode aufgerufen wird, denn sonst ist die zugrunde liegende Datei-handle ist nie geschlossen, bis GC macht es sehr viel später.
InformationsquelleAutor der Antwort Peter Lawrey
Blick auf diesen blog:
InformationsquelleAutor der Antwort NAVEED
Einmal java-8 (März 2014) Sie werden in der Lage sein zu verwenden, streams:
Druck alle Zeilen in der Datei:
InformationsquelleAutor der Antwort msayag
Hier ist ein Beispiel mit vollständiger Fehlerbehandlung und Unterstützung charset specification for pre-Java-7. Mit Java 7 kann man mit try-mit-Ressourcen-syntax, das macht den code sauberer.
Wenn Sie wollen einfach nur die Standard-Zeichenkodierung Sie können überspringen Sie den InputStream und die Nutzung FileReader.
Hier ist der Groovy-version, mit voller Fehlerbehandlung:
InformationsquelleAutor der Antwort DarkStar
In Java 8, die man tun könnte:
Einige Hinweise: Der stream zurückgegeben
Files.lines
(im Gegensatz zu den meisten streams) geschlossen werden muss. Für die Gründe hier erwähnt ich vermeiden, mitforEach()
. Die seltsamen code(Iterable<String>) lines::iterator
wirft einen Stream zu einem Durchsuchbar.InformationsquelleAutor der Antwort Aleksandr Dubinsky
Was Sie tun können, ist, Scannen Sie den gesamten text mit Scanner und gehen Sie durch den text Zeile für Zeile.
Natürlich importieren Sie die folgenden:
Scanner grundsätzlich durchsucht den gesamten text. Die while-Schleife wird verwendet, um die traverse durch den gesamten text.
Den
.hasNextLine()
Funktion ist ein boolescher Wert, der true zurückgibt, wenn es gibt noch mehr Zeilen im text. Die.nextLine()
- Funktion gibt Ihnen eine ganze Zeile als String den Sie dann verwenden können, wie Sie wollen. VersuchenSystem.out.println(line)
den text zu drucken.Seite Hinweis: .txt ist der Dateityp text.
InformationsquelleAutor der Antwort iskandarchacra
FileReader wird nicht lassen Sie die zu verwendende Kodierung, die Verwendung
InputStreamReader
stattdessen, wenn Sie brauchen, um es zu spezifizieren:Wenn Sie diese Datei importiert von Windows, könnte es haben, ANSI encoding (Cp1252), so müssen Sie die Codierung.
InformationsquelleAutor der Antwort 40-Love
In Java 7:
InformationsquelleAutor der Antwort Diego Duarte
Können Sie den Scanner verwenden Klasse
InformationsquelleAutor der Antwort Abhilash
Für Lesen der Datei mit java 8
InformationsquelleAutor der Antwort Ankit Sood
In Java 8 gibt es nun auch eine alternative zur Verwendung
- Dateien.Linien()
. Wenn die Eingangsquelle nicht eine Datei, sondern etwas abstrakter wie einReader
oder eineInputStream
können Sie stream die Linien über dieBufferedReader
slines()
Methode.Beispiel:
rufen
processLine()
für jeden Eingang liest derBufferedReader
.InformationsquelleAutor der Antwort Rüdiger Herrmann
Müssen Sie die
readLine()
Methode inclass BufferedReader
.Erstellen Sie ein neues Objekt von dieser Klasse und betreiben diese Methode auf ihn zu und speichern Sie es auf einem string.
BufferReader Javadoc
InformationsquelleAutor der Antwort Master C
Java-9 :
InformationsquelleAutor der Antwort Abdennour TOUMI
Den klaren Weg dies zu erreichen,
Beispiel:
Wenn Sie
dataFile.txt
auf Ihrem aktuellen VerzeichnisDie Ausgabe wie unten
InformationsquelleAutor der Antwort RAJAMOHAN-S
Es funktioniert für mich. Hoffe, Es wird Ihnen auch helfen.
InformationsquelleAutor der Antwort Dipendra Ghatal
Ich dokumentiert und getestet 10 verschiedene Möglichkeiten, um eine Datei Lesen im Java und dann liefen Sie gegeneinander, indem Sie Sie Lesen Sie im test-Dateien von 1KB und 1GB. Hier werden die schnellsten 3 Datei Lesen Methoden für das Einlesen einer 1GB Datei test.
Beachten Sie, dass beim ausführen des Leistungstests ich habe nicht die Ausgabe etwas zu der Konsole, da würde wirklich verlangsamen den test. Ich wollte nur den test der roh-Lesegeschwindigkeit.
1) java.nio.Datei.- Dateien.readAllBytes()
Getestet in Java 7, 8, 9. Dies war insgesamt die Schnellste Methode. Lesen einer 1-GB-Datei war durchweg knapp unter 1 Sekunde.
2) java.nio.Datei.- Dateien.Linien()
Getestet wurde dies erfolgreich in Java 8 und 9, aber es funktioniert nicht in Java 7, weil der Mangel an Unterstützung für lambda-Ausdrücke. Es dauerte etwa 3,5 Sekunden Einlesen einer 1GB Datei, die Sie auf dem zweiten Platz so weit wie beim Lesen größerer Dateien.
3) BufferedReader
Getestet, um in Java 7, 8, 9. Dieser dauerte etwa 4,5 Sekunden Einlesen einer 1GB Datei test.
Finden Sie die kompletten rankings für alle 10-Datei Lesen Methoden hier.
InformationsquelleAutor der Antwort gomisha
Normalerweise mache ich die lese-routine einfach:
InformationsquelleAutor der Antwort Binkan Salaryman
Können Sie auch
apache commons io
:InformationsquelleAutor der Antwort To Kra
Können Sie diesen code verwenden:
InformationsquelleAutor der Antwort Usman Yaqoob
Können Sie streams, es zu tun, genauer:
InformationsquelleAutor der Antwort spidy