Lese eine Datei in eine ArrayList

Lesen Sie eine Datei in eine ArrayList

1. Überblick

In diesem Tutorial werden wirdifferent ways of reading a file into an ArrayList diskutieren.

Es gibt viele Möglichkeiten zuread a file in Java. Sobald wir eine Datei gelesen haben, können wir viele Vorgänge mit dem Inhalt dieser Datei ausführen.

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

2. Verwenden vonFileReader

Die einfachste Art, eine Datei in Java zu lesen, ist die Verwendung vonFileReader. Per DefinitionFileReader is a convenience class for reading stream of characters from a File.

Es stehen mehrere Konstruktoren zur Verfügung, um aFileReader: zu initialisieren

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

Alle diese Konstruktoren setzen voraus, dass die Standardzeichencodierung und die Standardbytepuffergröße geeignet sind.

Wenn wir jedoch eine benutzerdefinierte Zeichencodierung und Bytepuffergröße bereitstellen möchten, können wirInputStreamReader oderFileInputStream verwenden.

Im folgenden Code wird gezeigt, wie Sie mitFileReader: Zeilen aus einer Datei inArrayList, 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 vonBufferedReader

ObwohlFileReader ziemlich einfach zu verwenden ist, ist es ratsam, es beim Lesen einer Datei immer mitBuffereReader zu umschließen.

Dies liegt daran, dassBufferedReader uses a char buffer to simultaneously read multiple values from a character-input stream and daher die Anzahl derread()-Aufrufe reduziert, die von den zugrunde liegendenFileStream ausgeführt werden.

Konstruktoren fürBufferedReader nehmenReader als Eingabe. Darüber hinaus können wir auch die Puffergröße in den Konstruktoren bereitstellen. 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 geerbten Methoden aus der KlasseReader gibtBufferedReader also die MethodereadLine()an, um eine ganze Zeile alsString: zu lesen

ArrayList result = new ArrayList<>();

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

4. Verwenden vonScanner

Eine andere übliche Methode zum Lesen von Dateien istScanner.

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

Beim Lesen von Dateien wirdScanner mitFile oderFileReader Objekten initialisiert:

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

Ähnlich wieBufferedReader, Scanner bietetreadLine() Methode zum Lesen einer ganzen Zeile. Zusätzlich bietetit auch einehasNext() Methode zum Anzeigen, ob mehr Werte zum Lesen verfügbar sind oder nicht ::

ArrayList result = new ArrayList<>();

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

Scanner unterteilt seine Eingabe mithilfe eines Trennzeichens in Token, wobei das Standardtrennzeichen ein Leerzeichen ist. Diese Token können mithilfe verschiedener Methodennext  (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 vonFiles.readAllLines

Der wahrscheinlich einfachste Weg, eine Datei zu lesen und alle ihre Zeilen inArrayList zu analysieren, ist die Verwendung vonreadAllLines() method available in Files class:

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

Diese Methode kann auch einen Zeichensatz-Parameter verwenden, um nach 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 Lesen des Inhalts vonFile inArrayList diskutiert. Außerdem haben wir einige Vor- und Nachteile der verschiedenen Methoden behandelt.

Zum Beispiel können wirBufferedReader verwenden, um Zeichen aus Effizienzgründen zu puffern. Alternativ könnten wirScanner verwenden, um Primitive mit Trennzeichen zu lesen. Oder vielleicht könnten wir einfachFiles.readAllLines(), verwenden, ohne uns um die zugrunde liegende Implementierung zu kümmern.

Wie üblich ist der Code in unserenGitHub repository verfügbar.