En Java, comment répertorier uniquement les sous-répertoires d'un répertoire?
J'aimerais utiliser la fonctionnalité Java.io.File. Quelle est la meilleure méthode en Java pour le faire?
Vous pouvez utiliser la classe File pour répertorier les répertoires.
File file = new File("/path/to/directory");
String[] directories = file.list(new FilenameFilter() {
@Override
public boolean accept(File current, String name) {
return new File(current, name).isDirectory();
}
});
System.out.println(Arrays.toString(directories));
Mettre à jour
Le commentaire de l’auteur sur ce post voulait un moyen plus rapide, une excellente discussion ici: Comment récupérer rapidement une liste de répertoires en Java?
Fondamentalement:
Une solution Java 8 très simple:
File[] directories = new File("/your/path/").listFiles(File::isDirectory);
Cela équivaut à utiliser un FileFilter (fonctionne aussi avec le vieux Java)
File[] directories = new File("/your/path/").listFiles(new FileFilter() {
@Override
public boolean accept(File file) {
return file.isDirectory();
}
});
@ Mohammed Mansour, vous y étiez presque ... l'argument "dir" de ce que vous utilisiez est en fait le chemin actuel, il retournera donc toujours vrai. Afin de voir si l'enfant est un sous-répertoire ou non, vous devez tester cet enfant.
File file = new File("/path/to/directory");
String[] directories = file.list(new FilenameFilter() {
@Override
public boolean accept(File current, String name) {
return new File(current, name).isDirectory();
}
});
System.out.println(Arrays.toString(directories));
Si une solution utilisant Java 7 et NIO.2 vous intéresse, procédez comme suit:
private static class DirectoriesFilter implements Filter<Path> {
@Override
public boolean accept(Path entry) throws IOException {
return Files.isDirectory(entry);
}
}
try (DirectoryStream<Path> ds = Files.newDirectoryStream(FileSystems.getDefault().getPath(root), new DirectoriesFilter())) {
for (Path p : ds) {
System.out.println(p.getFileName());
}
} catch (IOException e) {
e.printStackTrace();
}
ArrayList<File> directories = new ArrayList<File>(
Arrays.asList(
new File("your/path/").listFiles(File::isDirectory)
)
);
La solution qui a fonctionné pour moi est absente de la liste des réponses. C'est pourquoi je poste cette solution ici:
File[]dirs = new File("/mypath/mydir/").listFiles((FileFilter)FileFilterUtils.directoryFileFilter());
Ici, j'ai utilisé org.Apache.commons.io.filefilter.FileFilterUtils
d'Apache commons-io-2.2.jar. Sa documentation est disponible ici: https://commons.Apache.org/proper/commons-io/javadocs/api-2.2/org/Apache/commons/io/filefilter/FileFilterUtils.html
J'aimerais utiliser la fonctionnalité Java.io.File,
En 2012 (date de la question) oui, pas aujourd'hui. Java.nio
L'API doit être privilégié pour de telles exigences.
Terrible avec tant de réponses, mais pas la manière simple que j'utiliserais, c'est Files.walk().filter().collect()
.
Globalement, deux approches sont possibles:
1) Files.walk(Path start, )
n’a pas de maxDepth
limitations pendant
2) Files.walk(Path start, int maxDepth, FileVisitOption... options)
permet de le régler.
Sans spécifier aucune limitation de profondeur, cela donnerait:
Path directory = Paths.get("/foo/bar");
try {
List<Path> directories =
Files.walk(directory)
.filter(Files::isDirectory)
.collect(Collectors.toList());
} catch (IOException e) {
// process exception
}
Et si pour des raisons historiques, vous devez obtenir une liste de File
, vous pouvez simplement ajouter une opération map(Path::toFile)
avant la collecte:
Path directory = Paths.get("/foo/bar");
try {
List<File> directories =
Files.walk(directory)
.filter(Files::isDirectory)
.map(Path::toFile)
.collect(Collectors.toList());
} catch (IOException e) {
// process exception
}
Étant donné un répertoire de départ en tant que String
String
en tant que paramètre. Dans la méthode:listFiles
Voici la solution pour mon code. Je viens de faire un petit changement de la première réponse . Ceci listera tous les dossiers seulement dans le répertoire désiré, ligne par ligne:
try {
File file = new File("D:\\admir\\MyBookLibrary");
String[] directories = file.list(new FilenameFilter() {
@Override
public boolean accept(File current, String name) {
return new File(current, name).isDirectory();
}
});
for(int i = 0;i < directories.length;i++) {
if(directories[i] != null) {
System.out.println(Arrays.asList(directories[i]));
}
}
}catch(Exception e) {
System.err.println("Error!");
}
Pour ceux également intéressés par Java 7 et NIO, il existe une solution alternative à la réponse de @ voo ci-dessus . Nous pouvons utiliser un try-with-resources qui appelle Files.find()
et une fonction lambda utilisée pour filtrer les répertoires.
import Java.io.IOException;
import Java.nio.file.Files;
import Java.nio.file.Path;
import Java.nio.file.Paths;
import Java.util.stream.Stream;
final Path directory = Paths.get("/path/to/folder");
try (Stream<Path> paths = Files.find(directory, Integer.MAX_VALUE, (path, attributes) -> attributes.isDirectory())) {
paths.forEach(System.out::println);
} catch (IOException e) {
...
}
Nous pouvons même filtrer les répertoires par nom en changeant la fonction lambda:
(path, attributes) -> attributes.isDirectory() && path.toString().contains("test")
ou par date:
final long now = System.currentTimeMillis();
final long yesterday = new Date(now - 24 * 60 * 60 * 1000L).getTime();
// modified in the last 24 hours
(path, attributes) -> attributes.isDirectory() && attributes.lastModifiedTime().toMillis() > yesterday