Lesen Sie eine Datei in eine ArrayList

1. Übersicht

In diesem Tutorial werden verschiedene Möglichkeiten zum Einlesen einer Datei in eine ArrayList erläutert .

Es gibt viele Möglichkeiten, eine Datei in Java zu lesen. Sobald wir eine Datei gelesen haben, können wir viele Operationen am Inhalt dieser Datei ausführen.

Einige dieser Vorgänge, wie das Sortieren, erfordern möglicherweise die Verarbeitung des gesamten Inhalts der Datei im Speicher. Um solche Operationen auszuführen, müssen wir die Datei möglicherweise als Array oder als Liste von Zeilen oder Wörtern lesen .

2. Verwenden von FileReader

Die einfachste Art, eine Datei in Java zu lesen, ist die Verwendung von FileReader . Per Definition ist FileReader eine praktische Klasse zum Lesen von Zeichenströmen aus einer Datei.

Zum Initialisieren eines FileReader stehen mehrere Konstruktoren zur Verfügung :

FileReader f = new FileReader(String filepath); FileReader f = new FileReader(File f); FileReader f = new FileReader(FileDescriptor fd);

Alle diese Konstruktoren gehen davon aus, dass die Standardzeichencodierung und die Standardgröße des Bytepuffers angemessen sind.

Wenn wir jedoch eine benutzerdefinierte Zeichencodierung und Bytepuffergröße bereitstellen möchten, können wir InputStreamReader oder FileInputStream verwenden .

Im folgenden Code wird gezeigt, wie Sie mit FileReader Zeilen aus einer Datei in eine ArrayList lesen:

ArrayList result = new ArrayList(); try (FileReader f = new FileReader(filename)) { StringBuffer sb = new StringBuffer(); while (f.ready()) { char c = (char) f.read(); if (c == '\n') { result.add(sb.toString()); sb = new StringBuffer(); } else { sb.append(c); } } if (sb.length() > 0) { result.add(sb.toString()); } } return result;

3. Verwenden von BufferedReader

Obwohl FileReader recht einfach zu verwenden ist, ist es ratsam, es beim Lesen einer Datei immer mit BuffereReader zu versehen .

Dies liegt daran, dass BufferedReader einen Zeichenpuffer verwendet, um mehrere Werte gleichzeitig aus einem Zeicheneingabestream zu lesen, und somit die Anzahl der read () -Aufrufe reduziert, die vom zugrunde liegenden FileStream ausgeführt werden .

Konstrukteurs für BufferedReader nehmen Reader als Eingabe. Darüber hinaus können wir auch die Puffergröße in den Konstruktoren angeben. In den meisten Anwendungsfällen ist die Standardgröße jedoch groß genug:

BufferedReader br = new BufferedReader(new FileReader(filename)); BufferedReader br = new BufferedReader(new FileReader(filename), size);

Zusätzlich zu den von der Reader- Klasse geerbten Methoden bietet BufferedReader auch die readLine () -Methode, um eine ganze Zeile als String zu lesen :

ArrayList result = new ArrayList(); try (BufferedReader br = new BufferedReader(new FileReader(filename))) { while (br.ready()) { result.add(br.readLine()); } } 

4. Scanner verwenden

Eine andere übliche Methode zum Lesen von Dateien ist der Scanner .

Scanner ist ein einfacher Textscanner, mit dem primitive Typen und Zeichenfolgen mithilfe regulärer Ausdrücke analysiert werden.

Beim Lesen von Dateien wird der Scanner mithilfe von Datei- oder FileReader- Objekten initialisiert :

Scanner s = new Scanner(new File(filename)); Scanner s = new Scanner(new FileReader(filename));

Ähnlich wie BufferedReader bietet Scanner die Methode readLine () zum Lesen einer gesamten Zeile . Zusätzlich , bietet es auch eine hasNext () Methode , um anzuzeigen , ob weitere Werte sind für das Lesen oder nicht:

ArrayList result = new ArrayList(); try (Scanner s = new Scanner(new FileReader(filename))) { while (s.hasNext()) { result.add(s.nextLine()); } return result; }

Der Scanner unterteilt seine Eingabe mithilfe eines Trennzeichens in Token, wobei das Standardtrennzeichen ein Leerzeichen ist. Diese Token können mithilfe verschiedener next- Methoden ( nextInt , nextLong usw.) in Werte unterschiedlichen Typs konvertiert werden :

ArrayList result = new ArrayList(); try (Scanner s = new Scanner(new FileReader(filename))) { while (s.hasNext()) { result.add(s.nextInt()); } return result; }

5. Verwenden von Files.readAllLines

Der wahrscheinlich einfachste Weg, eine Datei zu lesen und alle ihre Zeilen in eine ArrayList zu analysieren , ist die Verwendung der Methode readAllLines () , die in der Klasse Files verfügbar ist :

List result = Files.readAllLines(Paths.get(filename));

Diese Methode kann auch einen Zeichensatzparameter verwenden, um gemäß einer bestimmten Zeichenkodierung zu lesen:

Charset charset = Charset.forName("ISO-8859-1"); List result = Files.readAllLines(Paths.get(filename), charset);

6. Fazit

Zusammenfassend haben wir einige gängige Methoden zum Einlesen des Inhalts einer Datei in eine ArrayList erörtert . Außerdem haben wir einige Vor- und Nachteile der verschiedenen Methoden behandelt.

Zum Beispiel können wir BufferedReader verwenden, um Zeichen aus Effizienzgründen zu puffern. Alternativ könnten wir Scanner verwenden , um Grundelemente mithilfe von Trennzeichen zu lesen. Oder wir könnten einfach Files.readAllLines () verwenden, ohne uns um die zugrunde liegende Implementierung zu kümmern .

Der Code ist wie gewohnt in unserem GitHub-Repository verfügbar.