Lijst met bestanden in een directory in Java

1. Overzicht

In deze korte tutorial bekijken we verschillende manieren om lijst bestanden in een map.

2. Aanbieding

Als we alle bestanden in de map willen weergeven en verder zoeken naar submappen willen overslaan, kunnen we gewoon gebruiken java.io.File # listFiles:

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 introduceerde echter een sneller alternatief naar Bestand # listFiles gebeld DirectoryStream.

Laten we eens kijken hoe het equivalent eruitziet:

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

Dat kunnen we gemakkelijk zien terwijl DirectoryStream kan sneller zijn, het maakt geen deel uit van de Stroom API en is niet zo ontvankelijk om ermee te werken.

Ook, DirectoryStream vereist dat we de bron sluiten, wat betekent dat we deze omwikkelen met een probeer-met-middelenook.

4. Lopen

Of, we kunnen alle bestanden in een map weergeven door wandelening het naar een geconfigureerd diepte.

Laten we gebruiken java.nio.file.Files # lopen om alle bestanden in een map tot een bepaalde diepte weer te geven:

public Set listFilesUsingFileWalk (String dir, int depth) gooit 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 ()); }}

Vergeet niet om te gebruiken probeer-met-middelen dus de bestandsingang voor richt wordt goed gesloten.

Of, als we meer controle willen hebben over wat er gebeurt met elk bezocht bestand, kunnen we ook een bezoekersimplementatie leveren:

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

Dit is handig als we onderweg extra bestanden willen lezen, verplaatsen of verwijderen.

5. Conclusie

In deze korte tutorial hebben we verschillende manieren onderzocht om bestanden in een map weer te geven.

Zoals altijd is de volledige broncode van de voorbeelden beschikbaar op GitHub.