119 votes

Java, liste uniquement les sous-répertoires d'un répertoire, pas les fichiers

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 ?

3voto

davidh Points 107

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
}

2voto

HugoTeixeira Points 2545

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

2voto

Paramaeleon Points 1030

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());
});

1voto

Abhishek Oza Points 982

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

1voto

Jitendra Pisal Points 91
    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.com

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.

Powered by:

X