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 ?

164voto

Mohamed Mansour Points 18019

Vous pouvez utiliser le Fichier pour lister 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));

Mise à jour

Commentaire de l'auteur sur ce post voulait un moyen plus rapide, grande discussion ici : Comment récupérer une liste de répertoires RAPIDEMENT en Java ?

En gros :

  1. Si vous contrôlez la structure du fichier, j'essaierais d'éviter de me retrouver dans cette situation.
  2. Dans Java NIO.2, vous pouvez utiliser la fonction directories pour renvoyer un itérateur afin de permettre une plus grande mise à l'échelle. La classe de flux de répertoires est un objet que vous pouvez utiliser pour itérer sur les entrées d'un répertoire.

124voto

headsvk Points 438

Une solution Java 8 très simple :

File[] directories = new File("/your/path/").listFiles(File::isDirectory);

C'est l'équivalent de l'utilisation d'un FileFilter (fonctionne également avec les anciens Java) :

File[] directories = new File("/your/path/").listFiles(new FileFilter() {
    @Override
    public boolean accept(File file) {
        return file.isDirectory();
    }
});

5 votes

Comment le double point :: fonctionne dans ce cas ?

1 votes

J'ai remarqué qu'aucune autre réponse n'utilise FileFilter, j'ai donc ajouté la version équivalente sans utiliser de références de méthodes. Pour plus d'informations sur les références de méthodes, reportez-vous à ce qui suit Question ou ceci article .

0 votes

Est-ce que cela récupère les sous-répertoires ou seulement les répertoires directement sous /votre/chemin/ ?

14voto

Javier Buzzi Points 2107

@Mohamed Mansour vous y étiez presque... l'argument "dir" que vous utilisiez est en fait le chemin actuel, donc il retournera 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));

7voto

voo Points 192

Si vous êtes intéressé par une solution utilisant Java 7 et NIO.2, voici comment cela pourrait se passer :

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

3voto

ArrayList<File> directories = new ArrayList<File>(
    Arrays.asList(
        new File("your/path/").listFiles(File::isDirectory)
    )
);

0 votes

Bonjour et bienvenue sur StackOverflow ! Pouvez-vous élaborer un peu plus votre réponse ? Par exemple, expliquer les parties intéressantes de vos extraits de code ou faire un lien vers la documentation pour une lecture plus approfondie ?

0 votes

Cela devrait être la bonne réponse car elle fournit un objet File avec le chemin canonique complet. C'est peut-être ancien mais cela vaut la peine de le signaler.

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