1. Dateien erstellen
Dateien programmgesteuert zu erstellen, ist häufig nötig: für Logs, temporäre Daten, Export von Berichten, Datenimport, das Speichern von Einstellungen und vieles mehr. In Java verwendet man dafür – wie Sie sich wahrscheinlich schon denken – am besten die moderne API java.nio.file.
Zentrales Werkzeug: Files.createFile(Path)
Diese Methode erstellt eine neue Datei am angegebenen Pfad. Wenn die Datei bereits existiert, wird eine Ausnahme ausgelöst.
Beispiel: Eine Textdatei im aktuellen Verzeichnis erstellen
import java.nio.file.*;
public class CreateFileExample {
public static void main(String[] args) {
Path path = Path.of("hello.txt");
try {
Files.createFile(path);
System.out.println("Datei erstellt: " + path.toAbsolutePath());
} catch (FileAlreadyExistsException e) {
System.out.println("Datei existiert bereits: " + path);
} catch (Exception e) {
System.out.println("Fehler beim Erstellen der Datei: " + e.getMessage());
}
}
}
Beachten Sie:
Files.createFile löst FileAlreadyExistsException aus, wenn die Datei bereits vorhanden ist. Daher prüft man vor dem Erstellen oft ihre Existenz.
Existenz einer Datei prüfen
Path path = Path.of("hello.txt");
if (!Files.exists(path)) {
Files.createFile(path);
}
Tipp:
Eine Existenzprüfung ist kein Schutz vor Race Conditions, aber für die meisten Nutzungsszenarien im Benutzerkontext ein durchaus praktikabler Ansatz.
Kurz: Was passiert beim Erstellen einer Datei?
- Wenn die Datei nicht existiert und der Pfad korrekt ist – wird eine neue leere Datei erstellt.
- Wenn die Datei bereits vorhanden ist – wird eine Ausnahme ausgelöst.
- Wenn der Pfad inkorrekt ist, Berechtigungen fehlen oder das Verzeichnis nicht existiert – wird eine andere Ausnahme ausgelöst (IOException, NoSuchFileException usw.).
2. Verzeichnisse erstellen
Unterschied zwischen Files.createDirectory und Files.createDirectories
- Files.createDirectory(Path) – erstellt nur ein einzelnes Verzeichnis. Wenn das übergeordnete Verzeichnis fehlt – führt das zu einem Fehler.
- Files.createDirectories(Path) – erstellt die gesamte Kette fehlender Verzeichnisse (wie ein Zauberer, der die Treppe direkt unter Ihren Füßen baut).
Beispiel: Ein einzelnes Verzeichnis erstellen
Path dir = Path.of("data");
try {
Files.createDirectory(dir);
System.out.println("Verzeichnis erstellt: " + dir.toAbsolutePath());
} catch (FileAlreadyExistsException e) {
System.out.println("Verzeichnis existiert bereits: " + dir);
} catch (Exception e) {
System.out.println("Fehler beim Erstellen des Verzeichnisses: " + e.getMessage());
}
Beispiel: Eine Struktur verschachtelter Verzeichnisse erstellen
Path nested = Path.of("data/reports/2024");
try {
Files.createDirectories(nested);
System.out.println("Verzeichnisstruktur erstellt: " + nested.toAbsolutePath());
} catch (Exception e) {
System.out.println("Fehler beim Erstellen der Struktur: " + e.getMessage());
}
Beachten Sie: Wenn einige Verzeichnisse bereits existieren, stört das createDirectories nicht – es erstellt lediglich die fehlenden. Wird createDirectory für ein untergeordnetes Verzeichnis verwendet, das übergeordnete existiert aber noch nicht – kommt es zu einem Fehler.
Tabelle: Vergleich der Methoden zum Erstellen von Verzeichnissen
| Methode | Erstellt nur ein einzelnes Verzeichnis | Erstellt verschachtelte Verzeichnisse | Schlägt nicht fehl, wenn ein Teil bereits existiert |
|---|---|---|---|
|
✔ | ✗ | ✗ |
|
✔ | ✔ | ✔ |
3. Dateien löschen
Dateien zu löschen ist fast wie Müll wegwerfen: Das Wichtigste ist, nichts Wichtiges zu entfernen! In Java gibt es dafür zwei Hauptmethoden:
- Files.delete(Path) – löscht eine Datei oder ein leeres Verzeichnis. Wenn die Datei nicht existiert – wird eine Ausnahme ausgelöst.
- Files.deleteIfExists(Path) – löscht eine Datei, aber wenn sie nicht existiert – bleibt es still und macht nichts.
Beispiel: Temporäre Datei löschen
Path tempFile = Path.of("temp.txt");
try {
Files.delete(tempFile);
System.out.println("Datei gelöscht: " + tempFile);
} catch (NoSuchFileException e) {
System.out.println("Datei nicht gefunden: " + tempFile);
} catch (DirectoryNotEmptyException e) {
System.out.println("Verzeichnis ist nicht leer: " + tempFile);
} catch (Exception e) {
System.out.println("Fehler beim Löschen: " + e.getMessage());
}
Sicherere Variante
boolean deleted = Files.deleteIfExists(tempFile);
if (deleted) {
System.out.println("Die Datei wurde gelöscht.");
} else {
System.out.println("Datei nicht gefunden – nichts zu löschen.");
}
Wichtig!
- Wenn die Datei in einem anderen Programm geöffnet ist – kann eine Ausnahme ausgelöst werden (z. B. unter Windows).
- Wenn versucht wird, ein Verzeichnis zu löschen, das nicht leer ist – führt das zur Ausnahme DirectoryNotEmptyException.
4. Verzeichnisse löschen
Verzeichnisse werden in Java ungefähr so gelöscht wie Dateien. Mit einem Unterschied: Die Standardmethoden löschen nur leere Verzeichnisse.
Beispiel: Leeres Verzeichnis löschen
Path emptyDir = Path.of("empty_folder");
try {
Files.delete(emptyDir);
System.out.println("Verzeichnis gelöscht: " + emptyDir);
} catch (DirectoryNotEmptyException e) {
System.out.println("Verzeichnis ist nicht leer: " + emptyDir);
} catch (NoSuchFileException e) {
System.out.println("Verzeichnis nicht gefunden: " + emptyDir);
} catch (Exception e) {
System.out.println("Fehler beim Löschen des Verzeichnisses: " + e.getMessage());
}
Was tun mit nicht leeren Verzeichnissen?
Zum Löschen nicht leerer Verzeichnisse müssen Sie rekursiv alle enthaltenen Dateien und Unterverzeichnisse löschen. Das ist ein Thema für eine eigene Vorlesung (und ein eigenes Abenteuer), aber wenn Sie es nicht abwarten können, hier ist der Code – schauen Sie ihn sich an und versuchen Sie, ihn nachzuvollziehen:
import java.nio.file.*;
import java.io.IOException;
public class DeleteDirectoryRecursively {
public static void deleteRecursively(Path path) throws IOException {
if (Files.isDirectory(path)) {
try (var entries = Files.list(path)) {
for (Path entry : entries.toList()) {
deleteRecursively(entry);
}
}
}
Files.delete(path);
}
}
Achtung:
Dieser Code löscht alles, was sich im Verzeichnis befindet! Verwenden Sie ihn mit Vorsicht.
5. Praktische Tipps
Existenzprüfung vor dem Löschen
if (Files.exists(path)) {
Files.delete(path);
} else {
System.out.println("Datei/Verzeichnis existiert nicht.");
}
Wenn Sie jedoch deleteIfExists verwenden, ist das nicht erforderlich.
Ausnahmen behandeln
Bei der Arbeit mit Dateien gibt es oft Überraschungen. Java wirft dafür unterschiedliche Ausnahmen:
- NoSuchFileException – Datei oder Verzeichnis nicht gefunden. Zum Beispiel, wenn Sie versuchen, etwas zu öffnen, das bereits gelöscht wurde.
- DirectoryNotEmptyException – Sie möchten ein Verzeichnis löschen, aber darin befindet sich noch etwas.
- IOException – genereller Hinweis: Etwas ist schiefgelaufen. Die Ursache kann unterschiedlich sein – fehlende Zugriffsrechte, die Datei ist von einem anderen Programm belegt, der Pfad ist inkorrekt.
Schaubild: wichtigste Methoden
+-------------------+ +--------------------+
| Files.createFile | ----> | Neue Datei |
+-------------------+ +--------------------+
+---------------------+ +--------------------+
| Files.createDirectory|----> | Neues Verzeichnis |
+---------------------+ +--------------------+
+-------------------+ +--------------------+
| Files.delete | ----> | Datei/Verzeichnis gelöscht |
+-------------------+ +--------------------+
(aber nur, wenn das Verzeichnis leer ist!)
6. Häufige Fehler beim Erstellen und Löschen von Dateien und Verzeichnissen
Fehler Nr. 1: Es wird versucht, eine Datei/ein Verzeichnis zu erstellen, das bereits existiert. Die Methoden Files.createFile und Files.createDirectory lösen eine Ausnahme aus, wenn das Objekt bereits vorhanden ist. Lösung – Existenz vorher prüfen oder die Ausnahme abfangen.
Fehler Nr. 2: Es wird versucht, ein verschachteltes Verzeichnis mit createDirectory zu erstellen, während das übergeordnete noch fehlt. In diesem Fall tritt die Ausnahme NoSuchFileException auf. Verwenden Sie createDirectories, um die Verzeichniskette zu erstellen.
Fehler Nr. 3: Es wird versucht, ein nicht leeres Verzeichnis mit Files.delete zu löschen. Das führt zu DirectoryNotEmptyException. Zum Löschen nicht leerer Verzeichnisse ist Rekursion nötig.
Fehler Nr. 4: Keine Berechtigung zum Erstellen/Löschen im angegebenen Verzeichnis. Es wird AccessDeniedException oder IOException ausgelöst. Starten Sie das Programm mit den erforderlichen Rechten oder verwenden Sie zugängliche Verzeichnisse.
Fehler Nr. 5: Datei wird von einem anderen Prozess verwendet. Unter Windows (und manchmal auch unter anderen Betriebssystemen) kann eine Datei nicht gelöscht werden, wenn sie in einem anderen Programm geöffnet ist. Sie erhalten eine IOException. Schließen Sie alle Anwendungen, die die Datei verwenden, bevor Sie löschen.
Fehler Nr. 6: Verwendung relativer Pfade ohne zu wissen „wo Sie sich befinden“. Die Datei wird nicht dort erstellt, wo Sie es erwarten. Verwenden Sie zur Sicherheit toAbsolutePath() und geben Sie den Pfad aus.
GO TO FULL VERSION