Überprüfen Sie, ob eine Datei oder ein Verzeichnis in Java vorhanden ist

1. Übersicht

In diesem kurzen Tutorial lernen wir verschiedene Möglichkeiten kennen, um das Vorhandensein einer Datei oder eines Verzeichnisses zu überprüfen.

Zuerst werden wir mit den modernen NIO-APIs beginnen und dann die alten IO-Ansätze behandeln.

2. Verwenden von java.nio.file.Files

Um zu überprüfen, ob eine Datei oder ein Verzeichnis vorhanden ist, können wir die Methode Files.exists (Path) verwenden . Wie aus der Methodensignatur hervorgeht, sollten wir zuerst einen Pfad zur beabsichtigten Datei oder zum beabsichtigten Verzeichnis erhalten. Dann können wir diesen Pfad an die Files.exists (Path) -Methode übergeben:

Path path = Paths.get("does-not-exist.txt"); assertFalse(Files.exists(path));

Da die Datei nicht vorhanden ist, wird false zurückgegeben . Erwähnenswert ist auch, dass die Files.exists (Path) -Methode , wenn sie auf eine IOException stößt , ebenfalls false zurückgibt .

Wenn die angegebene Datei jedoch vorhanden ist, wird sie wie erwartet true zurückgeben :

Path tempFile = Files.createTempFile("baeldung", "exist-article"); assertTrue(Files.exists(tempFile));

Hier erstellen wir eine temporäre Datei und rufen dann die Methode Files.exists (Path) auf .

Dies funktioniert sogar für Verzeichnisse :

Path tempDirectory = Files.createTempDirectory("baeldung-exists"); assertTrue(Files.exists(tempDirectory));

Wenn wir speziell wissen möchten, ob eine Datei oder ein Verzeichnis vorhanden ist, können wir auch die Methoden Files.isDirectory (Path) oder Files.isRegularFile (Path) verwenden:

assertTrue(Files.isDirectory(tempDirectory)); assertFalse(Files.isDirectory(tempFile)); assertTrue(Files.isRegularFile(tempFile));

Es gibt auch eine notExists (Path) -Methode, die true zurückgibt , wenn der angegebene Pfad nicht vorhanden ist:

assertFalse(Files.notExists(tempDirectory));

Manchmal sind die Files.exists (Path) zurückgibt falsch , weil wir nicht die erforderlichen Zugriffsrechte besitzen . In solchen Szenarien können wir die Methode Files.isReadable (Path) verwenden, um sicherzustellen, dass die Datei vom aktuellen Benutzer tatsächlich gelesen werden kann :

assertTrue(Files.isReadable(tempFile)); assertFalse(Files.isReadable(Paths.get("/root/.bashrc")));

2.1. Symbolische Links

Standardmäßig folgt die Methode Files.exists (Path) den symbolischen Links . Wenn Datei A einen symbolischen Link zu Datei B hat , gibt die Methode Files.exists (A) genau dann true zurück , wenn die Datei B bereits vorhanden ist:

Path target = Files.createTempFile("baeldung", "target"); Path symbol = Paths.get("test-link-" + ThreadLocalRandom.current().nextInt()); Path symbolicLink = Files.createSymbolicLink(symbol, target); assertTrue(Files.exists(symbolicLink));

Nun , wenn wir das Ziel der Verknüpfung löschen, die Files.exists (Path) wird wieder falsch :

Files.deleteIfExists(target); assertFalse(Files.exists(symbolicLink));

Da das Linkziel nicht mehr vorhanden ist, führt das Folgen des Links zu nichts und Files.exists (Path) gibt false zurück .

Es ist sogar möglich, den symbolischen Links nicht zu folgen, indem Sie als zweites Argument eine entsprechende LinkOption übergeben :

assertTrue(Files.exists(symbolicLink, LinkOption.NOFOLLOW_LINKS));

Da der Link selbst vorhanden ist, gibt die Methode Files.exists (Path) true zurück. Mit der Methode Files.isSymbolicLink (Path) können wir auch überprüfen, ob ein Pfad eine symbolische Verknüpfung ist :

assertTrue(Files.isSymbolicLink(symbolicLink)); assertFalse(Files.isSymbolicLink(target));

3. Verwenden von java.io.File

Wenn wir Java 7 oder eine neuere Version von Java verwenden, wird dringend empfohlen, die modernen Java NIO-APIs für diese Art von Anforderungen zu verwenden .

Um jedoch sicherzustellen, dass eine Datei oder ein Verzeichnis in der Java-Legacy-E / A-Welt vorhanden ist, können wir die Datei subsist () für Dateiinstanzen aufrufen :

assertFalse(new File("invalid").exists());

Wenn die Datei oder das Verzeichnis bereits vorhanden ist, wird true zurückgegeben :

Path tempFilePath = Files.createTempFile("baeldung", "exist-io"); Path tempDirectoryPath = Files.createTempDirectory("baeldung-exists-io"); File tempFile = new File(tempFilePath.toString()); File tempDirectory = new File(tempDirectoryPath.toString()); assertTrue(tempFile.exists()); assertTrue(tempDirectory.exists());

Wie oben gezeigt, ist es der Methode subsist () egal, ob es sich um eine Datei oder ein Verzeichnis handelt. Daher wird es true zurückgeben , solange es existiert .

Die Methode isFile () gibt jedoch true zurück , wenn der angegebene Pfad eine vorhandene Datei ist:

assertTrue(tempFile.isFile()); assertFalse(tempDirectory.isFile());

In ähnlicher Weise gibt die Methode isDirectory () true zurück , wenn der angegebene Pfad ein vorhandenes Verzeichnis ist:

assertTrue(tempDirectory.isDirectory()); assertFalse(tempFile.isDirectory());

Schließlich gibt die canRead () -Methode true zurück , wenn die Datei lesbar ist:

assertTrue(tempFile.canRead()); assertFalse(new File("/root/.bashrc").canRead());

Wenn false zurückgegeben wird , ist die Datei entweder nicht vorhanden oder der aktuelle Benutzer verfügt nicht über die Leseberechtigung für die Datei.

4. Fazit

In diesem kurzen Tutorial haben wir gesehen, wie Sie sicherstellen können, dass eine Datei oder ein Verzeichnis in Java vorhanden ist. Unterwegs sprachen wir über moderne NIO und die alten IO-APIs. Außerdem haben wir gesehen, wie die NIO-API mit symbolischen Links umgeht.

Wie üblich sind alle Beispiele auf GitHub verfügbar.