Listen Sie Dateien in einem Verzeichnis in Java auf

1. Übersicht

In diesem kurzen Tutorial werden verschiedene Möglichkeiten zum Auflisten von Dateien in einem Verzeichnis untersucht .

2. Auflistung

Wenn wir alle Dateien im Verzeichnis auflisten und das weitere Durchsuchen von Unterverzeichnissen überspringen möchten, können wir einfach java.io.File # listFiles verwenden :

public Set listFilesUsingJavaIO(String dir) { return Stream.of(new File(dir).listFiles()) .filter(file -> !file.isDirectory()) .map(File::getName) .collect(Collectors.toSet()); }

3. DirectoryStream

Java 7 führte jedoch eine schnellere Alternative zu File # listFiles mit dem Namen DirectoryStream ein .

Mal sehen, wie das Äquivalent aussieht:

public Set listFilesUsingDirectoryStream(String dir) throws IOException { Set fileList = new HashSet(); try (DirectoryStream stream = Files.newDirectoryStream(Paths.get(dir))) { for (Path path : stream) { if (!Files.isDirectory(path)) { fileList.add(path.getFileName() .toString()); } } } return fileList; }

Wir können leicht sehen , dass während DirectoryStream schneller sein kann, ist es nicht Teil des ist Stream - API und ist nicht ganz so zugänglich , mit ihm zu arbeiten.

Außerdem erfordert DirectoryStream , dass wir die Ressource schließen, was bedeutet, dass wir sie auch mit einem Versuch mit Ressourcen umschließen.

4. Gehen

Oder können wir alle Dateien in einem Verzeichnis , das von Liste zu Fuß ihn gleichzeitig zu einer konfigurierten Tiefe .

Verwenden Sie java.nio.file.Files # walk, um alle Dateien in einem Verzeichnis bis zu einer bestimmten Tiefe aufzulisten :

public Set listFilesUsingFileWalk(String dir, int depth) throws IOException { try (Stream stream = Files.walk(Paths.get(dir), depth)) { return stream .filter(file -> !Files.isDirectory(file)) .map(Path::getFileName) .map(Path::toString) .collect(Collectors.toSet()); } }

Denken Sie natürlich daran, try-with-resources zu verwenden, damit das Dateihandle für dir ordnungsgemäß geschlossen wird.

Wenn wir mehr Kontrolle darüber haben möchten, was mit jeder besuchten Datei passiert, können wir auch eine Besucherimplementierung bereitstellen:

public Set listFilesUsingFileWalkAndVisitor(String dir) throws IOException { Set fileList = new HashSet(); Files.walkFileTree(Paths.get(dir), new SimpleFileVisitor() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { if (!Files.isDirectory(file)) { fileList.add(file.getFileName().toString()); } return FileVisitResult.CONTINUE; } }); return fileList; }

Dies ist praktisch, wenn Sie unterwegs zusätzliche Dateien lesen, verschieben oder löschen möchten.

5. Schlussfolgerung

In diesem kurzen Tutorial haben wir verschiedene Möglichkeiten untersucht, um Dateien in einem Verzeichnis aufzulisten.

Wie immer ist der vollständige Quellcode der Beispiele auf GitHub verfügbar.