1. FilesKlasse

Dateiklasse

Für die Arbeit mit Dateien gibt es eine raffinierte Utility-Klasse – java.nio.file.Files. Es gibt Methoden für jeden Anlass. Alle Methoden dieser Klasse sind statisch und arbeiten mit dem Path-Objekt. Da es viele Methoden gibt, betrachten wir nur die wichtigsten:

Methode Beschreibung
Path createFile(Path path)
Erstellt eine neue Datei mit dem Pfadpath
Path createDirectory(Path path)
Erstellt ein neues Verzeichnis
Path createDirectories(Path path)
Erstellt mehrere Verzeichnisse
Path createTempFile(prefix, suffix)
Erstellt eine temporäre Datei
Path createTempDirectory(prefix)
Erstellt ein temporäres Verzeichnis
void delete(Path path)
Löscht eine Datei oder ein Verzeichnis, wenn es leer ist
Path copy(Path src, Path dest)
Kopiert eine Datei
Path move(Path src, Path dest)
Verschiebt eine Datei
boolean isDirectory(Path path)
Prüft, ob der Pfad ein Verzeichnis und keine Datei ist
boolean isRegularFile(Path path)
Prüft, ob der Pfad eine Datei und kein Verzeichnis ist
boolean exists(Path path)
Überprüft, ob ein Objekt am angegebenen Pfad vorhanden ist
long size(Path path)
Gibt die Dateigröße zurück
byte[] readAllBytes(Path path)
Gibt den gesamten Inhalt einer Datei als Array von Bytes zurück
String readString(Path path)
Gibt den gesamten Inhalt einer Datei als String zurück
List<String> readAllLines(Path path)
Gibt den gesamten Inhalt einer Datei als Liste von Zeichenfolgen zurück
Path write(Path path, byte[])
Schreibt ein Array von Bytes in eine Datei
Path writeString(Path path, String str)
Schreibt einen String in eine Datei
DirectoryStream<Path> newDirectoryStream(Path dir)
Gibt eine Sammlung von Dateien (und Unterverzeichnissen) aus dem angegebenen Verzeichnis zurück

2. Dateien und Verzeichnisse erstellen

Dateien und Verzeichnisse lassen sich sehr einfach erstellen. Überzeugen wir uns anhand einiger Beispiele:

Code Notiz
Files.createFile(Path.of("c:\\readme.txt"));
Erstellt eine Datei
Files.createDirectory(Path.of("c:\\test"));
Erstellt ein Verzeichnis
Files.createDirectories(Path.of("c:\\test\\1\\2\\3"));
Erstellt ein Verzeichnis und alle erforderlichen Unterverzeichnisse, falls diese nicht vorhanden sind.

3. Kopieren, Verschieben und Löschen

Das Kopieren, Verschieben und Löschen von Dateien ist ebenso einfach. Dies gilt auch für Verzeichnisse, diese müssen jedoch leer sein.

Code Notiz
Path path1 = Path.of("c:\\readme.txt");
Path path2 = Path.of("c:\\readme-copy.txt");
Files.copy(path1, path2);
Kopiert eine Datei
Path path1 = Path.of("c:\\readme.txt");
Path path2 = Path.of("d:\\readme-new.txt");
Files.move(path1, path2);
Verschiebt und benennt eine Datei um
Path path = Path.of("d:\\readme-new.txt");
Files.delete(path);
Löscht eine Datei

4. Überprüfen Sie den Typ und die Existenz einer Datei

Wenn Sie einen Pfad von jemand anderem erhalten haben, möchten Sie wissen, ob es sich um eine Datei oder ein Verzeichnis handelt. Und im Allgemeinen: Existiert eine solche Datei/ein solches Verzeichnis oder nicht?

Auch hierfür gibt es spezielle Methoden. Sie können die Länge einer Datei auch ganz einfach herausfinden:

Code Notiz
Files.isRegularFile(Path.of("c:\\readme.txt"));
true
Files.isDirectory(Path.of("c:\\test"));
true
 Files.exists(Path.of("c:\\test\\1\\2\\3"));
false
Files.size(Path.of("c:\\readme.txt"));
10112

5. Arbeiten mit Dateiinhalten

Schließlich gibt es eine ganze Reihe von Methoden, die es einfach machen, den Inhalt einer Datei zu lesen oder zu schreiben. Beispiel:

Code Beschreibung
Path path = Path.of("c:\\readme.txt");
List<String> list = Files.readAllLines(path);

for (String str : list)
   System.out.println(str);

Lesen Sie den Inhalt der Datei als Liste von Zeichenfolgen.

Zeigen Sie die Zeichenfolgen an


6. Den Inhalt eines Verzeichnisses abrufen

Die interessanteste Methode bleibt bestehen. Es wird verwendet, um Dateien und Unterverzeichnisse in einem bestimmten Verzeichnis abzurufen.

Wir sprechen von der newDirectoryStream()Methode, die ein spezielles DirectoryStream<Path>Objekt zurückgibt. Es verfügt über einen Iterator(!), mit dem Sie alle Dateien und Unterverzeichnisse eines bestimmten Verzeichnisses abrufen können.

Das ist einfacher als es klingt.

Code Beschreibung
Path path = Path.of("c:\\windows");

try (DirectoryStream<Path> files = Files.newDirectoryStream(path)) {
   for (Path path : files)
      System.out.println(path);
}


Holen Sie sich ein Objekt mit einer Liste von Dateien.
Durchlaufen Sie die Liste der Dateien

Das DirectoryStream<Path>Objekt hat zwei Eigenschaften. Erstens verfügt es über einen Iterator, der Dateipfade zurückgibt, und wir können dieses Objekt innerhalb einer for-eachSchleife verwenden.

Und zweitens ist dieses Objekt ein Datenstrom und muss daher explizit mit der close()Methode geschlossen oder als Verwendung innerhalb eines try-with-resourcesBlocks deklariert werden.



7. Files.newInputStreamMethode

Ab Java 5 sind die Klassen FileInputStreamund FileOutputStreamveraltet. Einer ihrer Nachteile bestand darin, dass beim Erstellen von Objekten dieser Klassen sofort Dateien auf der Festplatte erstellt werden. Und alle Ausnahmen im Zusammenhang mit der Dateierstellung könnten möglicherweise ausgelöst werden.

Später wurde erkannt, dass dies nicht die beste Entscheidung war. Dementsprechend wird empfohlen, die Methoden der java.nio.FilesUtility-Klasse zum Erstellen von Dateiobjekten zu verwenden.

Hier ist ein Vergleich zwischen dem alten Ansatz und dem neuen Ansatz zum Erstellen von Dateien:

Vor
String src = "c:\\projects\\log.txt";
InputStream input = new FileInputStream(src);
Nach
String src = "c:\\projects\\log.txt";
InputStream input = Files.newInputStream( Path.of(src) );

Und es gibt einen ähnlichen Ersatz für FileOutputStream:

Vor
String src = "c:\\projects\\log.txt";
OutputStream  output = new FileOutputStream( src );
Nach
String src = "c:\\projects\\log.txt";
OutputStream  output = Files.newOutputStream( Path.of( src ) );