Java Schnellstart – Dateien manipulieren

Viele Computerprogramme lesen, verändern, erstellen oder löschen Dateien auf deinem Computer. Das Managen von Dateien ist ein großes Themengebiet in der Informatik sowie der Programmierung. In dieser Lektion bekommst du einen, wie du Dateien mit Java verwaltest.

Dateien mit Java verwalten

Um Dateien mit Java verwalten zu können, bietet Java vorgefertigten Code mit vielen Klassen und Methoden. Um diesen Code zu verwenden, musst du diesen in dein Projekt einbinden. Das erledigst du mithilfe des Schlüsselwortes "import" sowie dem jeweiligen Paketnamen, der importiert werden soll. In unserem Fall heißt das Paket "java.io.File", wie nachfolgend definiert:

import java.io.File;  // Einbinden von java.io.File

class Main {
  public static void main(String[] args) {
     /* Erstellt ein neues 'Objekt' vom Typ File
        um damit die Datei "text.txt" (muss noch nicht existieren)
        verwalten zu können */
      File dateiObj = new File("text.txt");
  }
}

Datei mit relativem Pfad angeben

Bei der nachfolgend angegebenen Datei, handelt es sich um einen relativen Pfad d.h. Java würde beim Einlesen der Datei in demselben Verzeichnis schauen, wo sich auch die ausgeführte .jar Datei befindet.

import java.io.File;  // Einbinden von java.io.File

class Main {
  public static void main(String[] args) {
     /* Erstellt ein neues 'Objekt' vom Typ File
        um damit die Datei "text.txt" (muss noch nicht existieren)
        verwalten zu können, diesmal auf dem Desktop */
      File dateiObj = new File("C:\Users\Daniel\Desktop\text.txt");      
  }
}

Beachte, dass wir für einen Backslash '' zwei Anführungszeichen angeben müssen. Das müssen wir machen, weil ein einfacher Backslash, gefolgt von einem Buchstaben, normalerweise ein Sonderzeichen z.B. für einen Zeilenumbruch ist.

Dateien erstellen

Falls die Datei noch nicht existiert, können wir nun bei unserem Objekt "dateiObj" die Methode createNewFile() aufrufen. Der Rückgabetyp ist ein Boolean.

  • Falls die Datei bereits existiert wird keine neue Datei erstellt und false zurückgeliefert
  • Ansonsten wird eine neue Datei erstellt und true zurückgeliefert.

Im Code sieht das folgendermaßen aus:

import java.io.File;  // Einbinden von java.io.File
import java.io.IOException; // Einbinden von IOException

class Main {
  public static void main(String[] args) throws IOException {
     /* Erstellt ein neues 'Objekt' vom Typ File
        um damit die Datei "text.txt" (muss noch nicht existieren)
        verwalten zu können */
      File dateiObj = new File("text.txt");

      // Jetzt erstellen wir die Datei
      if(dateiObj.createNewFile())
      {
        System.out.println("Datei erstellt: " + dateiObj.getName());
      }
      else
      {
        System.out.println("Datei existiert bereits");
      }
  }
}

Hier sollte dir der Befehl "throws IOException"  in der Main-Methode auffallen. Bei einem Fehler,  z.B. wenn ein USB-Stick herausgezogen wird - wirft die Methode einen Fehler vom Typ IOException.

In der Programmierung hat man zwei Möglichkeiten, mit einem Fehler umzugehen:

  1. Entweder man "fängt" den Fehler ab, um ihn intern auswerten zu können (das kann man mit den Schlüsselwörtern try-catch machen) oder
  2. man wirft den Fehler weiter mit sogenannten "throws". Das ist zwar einfacher, aber dann stürzt unser komplettes Programm ab. Um einen IOException-Fehler "werfen" zu können, müssen wir vorher das Paket einbinden, indem die IOException definiert ist.

Dateien beschreiben

In Java kannst du Dateien ebenso beschreiben. Dafür gibt es die Klasse FileWriter, die wir nachfolgend importieren:

import java.io.FileWriter;
import java.io.IOException;

class Main {
  public static void main(String[] args) throws IOException {
    // Erstellt die Datei automatisch, falls sie noch nicht existiert
     FileWriter dateiSchreiber = new FileWriter("ergebnis.txt"); 
     int rechenOperation = 5+5;
     // Schreiben in eine Datei
     dateiSchreiber.write("Ergebnis von 5 + 5 = " + rechenOperation);
     // Die Datei ist für Schreibzugriffe für andere Programme gesperrt, solange
     // der FileWriter nicht geschlossen wurde
     dateiSchreiber.close();
  }
}

Im obigen Beispiel wird die Datei "ergebnis.txt" mit dem "Ergebnis von 5+5 = 10" beschrieben. Nach dem Schreibzugriff wird die Datei gespeichert und geschlossen.

Dateien einlesen

Mit der Hilfe der Klasse "Scanner" kannst du einen Text einlesen. Um den Scanner verwenden zu können, musst du zunächst das Paket "java.util.Scanner" in dein Projekt einbinden.

Zum Einlesen des Textest musst du beim Erzeugen eines Objektes (Variable) ein Objekt vom Typ File übergeben:

import java.io.File;
import java.io.IOException;
import java.util.Scanner; // Einbinden von Scanner

class Main {
  public static void main(String[] args) throws IOException {
    File ergebnis = new File("ergebnis.txt");

    Scanner dateiLeser = new Scanner(ergebnis);

    // Solange es noch eine Zeile zum Auslesen gibt
    while(dateiLeser.hasNextLine())
    {
      // Lese die nächste Zeile und gebe diese aus
      System.out.println(dateiLeser.nextLine());
    }
  }
}

Im obigen Beispiel wird die Datei "ergebnis.txt" vom Anfang bis zum Ende eingelesen und mit dem println-Befehl auf den Bildschirm gedruckt.

Dateien löschen

Das Löschen von Dateien ist simpel. Dafür musst du die Methode delete() von "File" ausführen.

Das sieht im Code folgendermaßen aus:

import java.io.File;
import java.io.IOException;

class Main {
  public static void main(String[] args) throws IOException {
    File datei = new File("ergebnis.txt"); // zu löschende Datei
    datei.delete();
  }
}

Im obigen Beispiel wird die "datei" (ergebnis.txt) gelöscht.

Code-Aufgabe: Jetzt bist du gefragt - Zahlen einlesen und Rechnen

Für die folgende Code-Challenge sollst du zwei Zahlen aus der Datei "zahlen.txt" auslesen. In jeder Zeile befindet sich genau eine Zahl.

Nun sollst du die zwei eingelesenen Zahlen miteinander addieren, die alte "zahlen.txt "löschen und eine neue "zahlen.txt" erstellen, welche das berechnete Ergebnis beinhaltet.

(Hinweis: Einen String kannst du übrigens über Integer.parseInt(String zahl) in einen Integer umwandeln)

[lp_spoiler title="Lösung anzeigen" class="da"]

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;

class Main {
  public static void main(String[] args) throws IOException {
    File f = new File("zahlen.txt");
    Scanner s = new Scanner(f);

    int zahl1 = Integer.parseInt(s.nextLine());
    int zahl2 = Integer.parseInt(s.nextLine());
    int ergebnis = zahl1 + zahl2;

    f.delete();
    
    FileWriter w = new FileWriter("zahlen.txt");
    w.write("Ergebnis von " + zahl1 + " + " + zahl2 + " = " + ergebnis);
    w.close();
  }
}

[/lp_spoiler]

Fazit

Das Manipulieren von Dateien ist ein wichtiges Gebiet in der Informatik. In dieser Lektion hast du einen Einblick in die Dateiverwaltung mit Java erhalten. Du weißt jetzt bereits, wie du Dateien anlegst, ausliest, beschreibst und löscht. Damit hast du die wichtigsten Grundlagen zum File Handling gelernt.