Java - Textdatei Zeile für Zeile einlesen/schreiben

Java - Textdatei Zeile für Zeile einlesen/schreiben

Von Zeit zu Zeit kann es vorkommen, dass man einfache Bearbeitungen an einer Datei vornehmen muss oder aber Inhalte einer Textdatei zeilenweise einlesen oder schreiben muss. Hierbei kann es vor allen Dingen bei leistungsschwachen Geräten vorkommen, dass dies so optimiert wie möglich geschehen muss. Vereinfacht gesagt will man eine unter Umständen sehr lange Textdatei zeilenweise einlesen und/oder beschreiben. In einem vorangegangenen Artikel hatte ich bereits erklärt, wie man eine CSV Datei zeilenweise einlesen kann und aus diesen Zeilen Objekte erstellen kann.

Im Rahmen dieses Artikels soll es zwei kurze Codeschnipsel geben, mithilfe derer wir eine Textdatei zeilenweise einlesen können und beschreiben können.

Textdatei zeilenweise lesen

Folgender Code kann genutzt werden, um eine Textdatei einzulesen:

File file = new File("dateipfad/..../dateiname.txt");
try {
    BufferedReader br = new BufferedReader(new FileReader(file));
    for(String line; (line = br.readLine()) != null; ) {
        doSomething(line);
    }
}catch(IOException e){
    System.out.println(e.getMessage());
}


Textdatei zeilenweise schreiben

Folgender Code kann genutzt werden, um einer neuen oder bestehenden Textdatei eine neue Zeile hinzuzufügen und zu speichern:

try{
    FileWriter fw = new FileWriter("dateipfad/..../neuerDateiname.txt", true);
    BufferedWriter bw = new BufferedWriter(fw);
    PrintWriter out = new PrintWriter(bw);

    out.println("text der neuen Zeile");

    out.close();
} catch (IOException e) {
    System.out.println(e.getMessage());
}


Der hier gezeigte zweite Codeschnipsel dient zum Schreiben einer einzelnen Zeile in eine Textdatei. 
Achtung: Erst wenn die Funktion "out.close()" aufgerufen wird, wird auch die Datei beschrieben. Sollten wir effektiv also vorher zweimalig "out.println(....)" aufrufen, so werden effektiv zwei Zeilen auf einmal in die Datei geschrieben. 

Wie erreichen wir dann in der Realität das Schreiben einer neuen Zeile in die Datei? - Indem wir den zweiten Codeschnipsel in eine eigene Funktion auslagern und diese mehrfach aufrufen. Wir "öffnen" die Datei also mehrfach (bei jedem Aufruf der Funktion) und beschrieben diese ebenfalls mehrfach. Nicht ganz die eleganteste Version, allerdings nutzbar auf leistungsschwachen Geräten, wie beispielsweise eine Raspberry Pi.

Beispiel - Zeilenweise Bearbeitung einer Textdatei

Der folgende Beispielcode wird mittels zwei Parametern aufgerufen. Der erste Parameter beschreibt den Pfad zur "originalen Datei". Der zweite Parameter beschreibt den Pfad zu der Datei, die wir zeilenweise beschreiben wollen. Die Aufgabe des Codes ist es eine CSV-Datei einzulesen und den ersten Parameter der CSV ein weiteres Mal an das Ende der Datei einzufügen:

package de.staticfloat;

import java.io.*;

public class Main {

    public static void main(String[] args) {

        if(args == null || args.length < 2){
            System.out.println("Bitte gebe zwei Parameter ein.");
            System.out.println("Paramter 1: Dateipfad des Inputs.");
            System.out.println("Paramter 2: Dateipfad des Outputs.");
        }

        handleFile(args[0], args[1]);

    }

    public static void handleFile(String inputPfad, String outputPfad){
        File inputFile = new File(inputPfad);
        try{
            BufferedReader br = new BufferedReader(new FileReader(inputFile));
            for(String line; (line = br.readLine()) != null;){
                modifyLine(line, outputPfad);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void modifyLine(String line, String outputPfad){

        String[] splittedLineValues = line.split(";");
        String newLine = String.join(";", splittedLineValues);
        newLine += ";" + splittedLineValues[0];

        writeLineToFile(newLine, outputPfad);
    }

    public static void writeLineToFile(String line, String outputPfad){
        try{
            FileWriter fw = new FileWriter(outputPfad, true);
            BufferedWriter bw = new BufferedWriter(fw);
            PrintWriter out = new PrintWriter(bw);

            out.println(line);

            out.close();
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

Marvin

Ich bin ein Mensch, der sich neben der Programmierung noch für tausend andere Dinge interessiert, die mal mehr und mal weniger verrückt sind. Vor allem aber bin ich Feuer und Flamme mit der Programmierung von eigenen kleinen Apps und Programmen, die mein Leben bereichern.

Hat dir dieser Artikel gefallen?

Kommentar hinzufügen

*Pflichtfeld