Warum die Arbeit mit Dateien in Java nicht beängstigend ist?
\n\nJeder Entwickler, selbst wenn er nur Backend in Java schreibt, steht früher oder später vor der Notwendigkeit, Daten zu speichern, eine Konfiguration zu lesen oder ein Log zu verarbeiten. Die Arbeit mit Dateien und dem Dateisystem in Java ist eine grundlegende Fähigkeit, die „Spielzeug“-Konsolenanwendungen in echte Dienstprogramme verwandelt. Und ja, im Jahr 2024 haben wir nicht nur den guten alten File, sondern auch das leistungsstarke java.nio.file.
In diesem Artikel behandeln wir alles: vom Öffnen eines Notizblocks bis zur Manipulation von Zugriffsrechten. Los geht's!
\n\n1. Der klassische Ansatz: java.io.File
\n\nBeginnen wir mit dem Urvater. Die Klasse File wurde in Java 1.0 eingeführt und wird immer noch verwendet. Aber seien wir ehrlich: Sie dreht sich mehr um Metadaten als um den Inhalt. Mit ihr kann man überprüfen, ob eine Datei existiert, einen Ordner erstellen oder eine Liste von Dateien abrufen.
import java.io.File;\n\npublic class FileExample {\n public static void main(String[] args) {\n File file = new File("/home/user/docs/notes.txt");\n \n System.out.println("Datei existiert: " + file.exists());\n System.out.println("Absoluter Pfad: " + file.getAbsolutePath());\n System.out.println("Größe: " + file.length() + " Bytes");\n \n // Verzeichnis erstellen\n File dir = new File("/home/user/new_folder");\n if (dir.mkdir()) {\n System.out.println("Ordner erstellt");\n }\n }\n}\n\nNachteil: File kann große Dateien nicht richtig lesen – dafür werden Ströme benötigt. Und es unterstützt keine symbolischen Links (Soft Links) von Haus aus. Deshalb haben Sun (und später Oracle) NIO veröffentlicht.
2. Lesen von Dateien: Von InputStream bis BufferedReader
\n\nLesen ist die häufigste Operation. Wenn die Datei textbasiert ist, verwenden Sie BufferedReader – er puffert die Daten und arbeitet schnell.
import java.io.BufferedReader;\nimport java.io.FileReader;\nimport java.io.IOException;\n\npublic class ReadFile {\n public static void main(String[] args) {\n try (BufferedReader br = new BufferedReader(new FileReader("data.txt"))) {\n String line;\n while ((line = br.readLine()) != null) {\n System.out.println(line);\n }\n } catch (IOException e) {\n System.err.println("Lesefehler: " + e.getMessage());\n }\n }\n}\n\nFür Binärdateien (Bilder, Archive) verwenden Sie FileInputStream:
import java.io.FileInputStream;\nimport java.io.IOException;\n\npublic class ReadBinary {\n public static void main(String[] args) {\n try (FileInputStream fis = new FileInputStream("image.png")) {\n byte[] buffer = new byte[1024];\n int bytesRead;\n while ((bytesRead = fis.read(buffer)) != -1) {\n // verarbeite den Block buffer[0..bytesRead]\n }\n } catch (IOException e) {\n e.printStackTrace();\n }\n }\n}\n\nWichtig: Verwenden Sie immer try-with-resources – dies garantiert das Schließen des Streams, selbst wenn eine Ausnahme ausgelöst wird.
3. Schreiben in Dateien: BufferedWriter und FileOutputStream
\n\nSchreiben ist fast symmetrisch zum Lesen. Für Text – BufferedWriter, für Binärdaten – FileOutputStream.
import java.io.BufferedWriter;\nimport java.io.FileWriter;\nimport java.io.IOException;\n\npublic class WriteFile {\n public static void main(String[] args) {\n try (BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"))) {\n bw.write("Hallo, Welt!");\n bw.newLine();\n bw.write("Java ist mächtig.");\n } catch (IOException e) {\n e.printStackTrace();\n }\n }\n}\n\nWenn Sie an das Ende einer Datei anhängen möchten, anstatt sie zu überschreiben