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();
}
}
}