Übersicht
In diesem Lernprogramm werden verschiedene Möglichkeiten zum Lesen aus einer Datei in Java untersucht .
Zuerst lernen wir, wie eine Datei aus dem Klassenpfad, einer URL oder einer JAR-Datei mit Standard-Java-Klassen geladen wird.
Zweitens werden wir sehen, wie Zum Lesen des Inhalts mit BufferedReader, Scanner, StreamTokenizer, DataInputStream, SequenceInputStream und FileChannel wird auch das Lesen einer UTF-8-codierten Datei erläutert.
Abschließend werden die neuen zu ladenden Techniken erläutert und lesen Sie eine Datei in Java 7 und Java 8.
Dieser Artikel ist Teil der Reihe „Java – Back to Basic“ in Baeldung.
Weiterführende Literatur:
Java – Erstellen einer Datei
Java – In Datei schreiben
Setup
2.1 Eingabedatei
In den meisten Beispielen in diesem Artikel lesen wir eine Textdatei mit dem Dateinamen fileTest.txt, die eine Zeile enthält:
Für einige Beispiele verwenden wir eine andere Datei. In diesen Fällen werden wir die Datei und ihren Inhalt explizit erwähnen.
2.2 Hilfsmethode
Wir werden eine Reihe von Testbeispielen mit Kern verwenden Nur Java-Klassen, und in den Tests werden Assertions mit Hamcrest-Matchern verwendet.
Tests verwenden eine gemeinsame readFromInputStream-Methode, die einen InputStream in String umwandelt, um die Bestätigung der Ergebnisse zu vereinfachen:
Beachten Sie, dass es andere Möglichkeiten gibt, dasselbe Ergebnis zu erzielen. In diesem Artikel finden Sie einige Alternativen.
Lesen einer Datei aus dem Klassenpfad
3.1 Verwenden von Standard-Java
In diesem Abschnitt wird erläutert, wie Sie eine Datei lesen, die in einem Klassenpfad verfügbar ist. Wir lesen die Datei „fileTest.txt“, die unter src / main / resources verfügbar ist :
Im obigen Codeausschnitt haben wir die aktuelle Klasse zum Laden einer Datei mit der Methode getResourceAsStream verwendet und den absoluten Pfad der zu ladenden Datei übergeben.
Dieselbe Methode ist für verfügbar auch eine ClassLoader-Instanz:
Wir erhalten die classLoa der der aktuellen Klasse mit getClass (). getClassLoader ().
Der Hauptunterschied besteht darin, dass bei Verwendung von getResourceAsStream in einer ClassLoader-Instanz der Pfad ab dem Stammverzeichnis des Klassenpfads als absolut behandelt wird.
Bei Verwendung für eine Klasseninstanz kann der Pfad relativ zum Paket oder ein absoluter Pfad sein, der durch den führenden Schrägstrich angedeutet wird.
Beachten Sie dies natürlich in der Praxis Offene Streams sollten immer geschlossen sein, wie z. B. der InputStream in unserem Beispiel:
3.2. Verwenden der commons-io-Bibliothek
Eine weitere häufige Option ist die Verwendung der FileUtils-Klasse des commons-io-Pakets:
Hier übergeben wir das File-Objekt an das Methode readFileToString () der FileUtils-Klasse. Diese Utility-Klasse kann den Inhalt laden, ohne dass Boilerplate-Code geschrieben werden muss, um eine InputStream-Instanz zu erstellen und Daten zu lesen.
Dieselbe Bibliothek bietet auch die IOUtils-Klasse an:
Hier haben wir Übergeben Sie das FileInputStream-Objekt an die Methode toString () der IOUtils-Klasse. Diese Dienstprogrammklasse verhält sich wie die vorherige, um eine InputStream-Instanz zu erstellen und Daten zu lesen.
Lesen mit BufferedReader
Lassen Sie jetzt “ s konzentrieren sich auf verschiedene Methoden zum Parsen des Inhalts einer Datei.
Wir beginnen mit einer einfachen Methode zum Lesen aus einer Datei mit BufferedReader:
Beachten Sie, dass readLine () zurückgegeben wird null, wenn das Ende der Datei erreicht ist.
Lesen aus einer Datei mit Java NIO
In JDK7 wurde das NIO-Paket erheblich aktualisiert.
Schauen wir uns ein Beispiel mit der Files-Klasse und der readAllLines-Methode an. Die readAllLines-Methode akzeptiert einen Pfad.
Die Pfadklasse kann als Upgrade der Datei java.io.File mit einigen zusätzlichen Vorgängen betrachtet werden.
5.1. Lesen einer kleinen Datei
Der folgende Code zeigt, wie eine kleine Datei mit der neuen Klasse „Dateien“ gelesen wird:
Beachten Sie, dass wir readAllBytes () verwenden können. Methode auch, wenn wir binäre Daten benötigen.
5.2. Lesen einer großen Datei
Wenn wir eine große Datei mit der Klasse „Dateien“ lesen möchten, können wir den BufferedReader verwenden.
Der folgende Code liest die Datei mit die neue Files-Klasse und BufferedReader:
5.3. Lesen einer Datei mit Files.lines ()
JDK8 bietet die lines () -Methode innerhalb der Files-Klasse an. Es gibt einen Stream von String-Elementen zurück.
Schauen wir uns ein Beispiel an, wie Daten in Bytes gelesen und mit dem UTF-8-Zeichensatz dekodiert werden.
Der folgende Code liest die Datei mit die neuen Files.lines ():
Wenn Sie Stream mit E / A-Kanälen wie Dateivorgängen verwenden, müssen Sie den Stream explizit mit der Methode close () schließen.
Wie wir sehen können, bietet die Datei-API eine weitere einfache Möglichkeit, den Dateiinhalt in einen String einzulesen.
In den nächsten Abschnitten werden wir uns andere weniger gebräuchliche Methoden von ansehen Lesen einer Datei, die in bestimmten Situationen geeignet sein kann.
Lesen mit dem Scanner
Als Nächstes verwenden wir einen Scanner zum Lesen aus der Datei. Hier verwenden wir Leerzeichen als Trennzeichen:
Beachten Sie, dass das Standardtrennzeichen das Leerzeichen ist, aber mit einem Scanner mehrere Trennzeichen verwendet werden können.
Die Scannerklasse ist beim Lesen hilfreich Inhalt von der Konsole oder wenn der Inhalt primitive Werte mit einem bekannten Trennzeichen enthält (z. B. eine durch Leerzeichen getrennte Liste von Ganzzahlen).
Lesen mit StreamTokenizer
Lassen Sie uns nun eine Textdatei mit einem StreamTokenizer in Token einlesen.
Der Tokenizer ermittelt zunächst, was das nächste Token, eine Zeichenfolge oder eine Zahl ist. Wir tun dies, indem wir uns das Feld tokenizer.ttype ansehen.
Dann lesen wir das tatsächliche Token basierend auf diesem Typ:
- tokenizer.nval – wenn der Typ war eine Zahl
- tokenizer.sval – wenn der Typ ein String war
In diesem Beispiel verwenden wir eine andere Eingabedatei, die einfach Folgendes enthält:
Der folgende Code liest aus der Datei sowohl den String als auch die Nummer:
Beachten Sie, wie das Token für das Dateiende am Ende verwendet wird.
Dieser Ansatz ist nützlich, um einen Eingabestream in Token zu analysieren.
Lesen mit DataInputStream
Wir können DataInputStream zum Lesen von Binärdateien oder verwenden primitive Datentypen aus einer Datei.
Der folgende Test liest die Datei mit einem DataInputStream:
Lesen mit FileChannel
Wenn wir Wenn Sie eine große Datei lesen, kann FileChannel schneller als Standard-E / A sein.
Der folgende Code liest Datenbytes mit FileChannel und RandomAccessFile aus der Datei:
Lesen einer UTF-8-Codierung ed Datei
Nun wollen wir sehen, wie eine UTF-8-codierte Datei mit BufferedReader gelesen wird. In diesem Beispiel lesen wir eine Datei, die chinesische Schriftzeichen enthält:
Lesen von Inhalten von URL
Zum Lesen von Inhalten von einer URL verwenden wir „/“ URL in unserem Beispiel:
Es gibt auch alternative Möglichkeiten, eine Verbindung zu einer URL herzustellen. Hier haben wir die URL- und URLConnection-Klasse verwendet, die im Standard-SDK verfügbar ist.
Lesen einer Datei aus einer JAR
Zum Lesen einer Datei, die sich in a befindet JAR-Datei, wir benötigen eine JAR mit einer Datei darin. In unserem Beispiel lesen wir „LICENSE.txt“ aus der Datei „hamcrest-library-1.3.jar“:
Hier möchten wir LICENSE.txt laden, das sich in der Hamcrest-Bibliothek befindet, also verwenden wir Die Matcher-Klasse, mit der eine Ressource abgerufen werden kann. Dieselbe Datei kann auch mit dem Klassenladeprogramm geladen werden.
Schlussfolgerung
Wie wir sehen können, Es gibt viele Möglichkeiten, eine Datei mit einfachem Java zu laden und Daten daraus zu lesen.
Wir können eine Datei von verschiedenen Speicherorten wie Klassenpfad-, URL- oder JAR-Dateien laden.
Dann haben wir kann BufferedReader zum zeilenweisen Lesen verwenden, Scanner zum Lesen mit verschiedenen Trennzeichen, StreamTokenizer zum Einlesen einer Datei in Token, DataInputStream zum Lesen von Binärdaten und primitiven Datentypen, SequenceInput Stream zum Verknüpfen mehrerer Dateien zu einem Stream, FileChannel zum schnelleren Lesen von großen Dateien usw.