En Java, comment lister 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 ?
En Java, comment lister 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 ?
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ée pour de telles exigences.
Terrible avec tant de réponses, mais pas la manière simple que j'utiliserais c'est à dire Files.walk().filter().collect()
.
Globalement, deux approches sont possibles :
1) Files.walk(Path start, )
n'a pas maxDepth
les limitations tandis que
2) Files.walk(Path start, int maxDepth, FileVisitOption... options)
permet de le régler.
Sans spécifier de limite 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 d'héritage, vous avez besoin d'obtenir une liste de File
vous pouvez simplement ajouter un map(Path::toFile)
opération 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
}
Pour ceux qui s'intéressent aussi à Java 7 et à NIO, il existe une solution alternative à La réponse de @voo ci-dessus . Nous pouvons utiliser un essayer avec les ressources qui appelle Files.find()
et une fonction lambda qui est 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 modifiant 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
Cela va littéralement lister (c'est-à-dire imprimer) tous les sous-répertoires. Il s'agit essentiellement d'une sorte de boucle dans laquelle il n'est pas nécessaire de stocker les éléments intermédiaires dans une liste. C'est ce dont on a le plus souvent besoin, donc je le laisse ici.
Path directory = Paths.get("D:\\directory\\to\\list");
Files.walk(directory, 1).filter(entry -> !entry.equals(directory))
.filter(Files::isDirectory).forEach(subdirectory ->
{
// do whatever you want with the subdirectories
System.out.println(subdirectory.getFileName());
});
La solution qui a fonctionné pour moi, est absente de la liste des réponses. C'est pourquoi je publie cette solution ici :
File[]dirs = new File("/mypath/mydir/").listFiles((FileFilter)FileFilterUtils.directoryFileFilter());
Ici, j'ai utilisé org.apache.commons.io.filefilter.FileFilterUtils
à partir de 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
File files = new File("src");
// src is folder name...
//This will return the list of the subDirectories
List<File> subDirectories = Arrays.stream(files.listFiles()).filter(File::isDirectory).collect(Collectors.toList());
// this will print all the sub directories
Arrays.stream(files.listFiles()).filter(File::isDirectory).forEach(System.out::println);
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.