Méthode list() de Java java.nio.file.Files

Java File Java java.nio.file.Files


java.nio.file.Files.list()est une méthode utilitaire fournie dans le package Java NIO (New I/O) pour lister le contenu d'un répertoire. Cette méthode renvoie unStream<Path>objet, contenant toutes les entrées (fichiers et sous-répertoires) dans le répertoire spécifié.

Définition de méthode

public static Stream<Path> list(Path dir) throws IOException

Paramètres de méthode

paramètre dir

  • Type:java.nio.file.Path
  • Description: Le chemin du répertoire dont le contenu doit être listé
  • Notes:
    • Si le paramètre n'est pas un répertoire, il lèveraNotDirectoryException
    • Le chemin doit exister, sinon une exception sera levéeNoSuchFileException
    • Si le programme n'a pas l'autorisation de lecture pour le répertoire, une exception sera levéeAccessDeniedException

Valeur de retour

Flux

  • Description: Un flux contenant toutes les entrées (fichiers et sous-répertoires) dans le répertoire
  • Fonctionnalités:
    • Les éléments dans le flux sontPathobjets.
    • Le flux est ordonné selon l'ordre naturel des entrées du répertoire (généralement triées par nom)
    • Le flux est chargé paresseusement ; il ne lit réellement le contenu du répertoire que lorsqu'il est parcouru
    • Le flux doit être correctement fermé pour libérer les ressources système

Caractéristiques de la méthode

1. Non récursif

list()La méthode ne liste que les entrées directement dans le répertoire spécifié ; elle ne liste pas récursivement le contenu des sous-répertoires.

2. Exclure les entrées spéciales

Le flux renvoyé ne contient pas les entrées pour le répertoire lui-même (".") et le répertoire parent ("..").

3. Gestion des ressources

Étant donné qu'un Stream est renvoyé, il est recommandé d'utiliser une instruction try-with-resources pour garantir que le flux est correctement fermé :

Exemple

try (Stream<Path> stream = Files.list(Paths.get("/path/to/dir"))) {
    stream.forEach(System.out::println);
}

Exemples d'utilisation

Utilisation de base : lister le contenu d'un répertoire

Exemple

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;

public class ListDirectoryExample {
    public static void main(String[] args) {
        Path dir = Paths.get("C:/example");
       
        try (Stream<Path> stream = Files.list(dir)) {
            stream.forEach(System.out::println);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Utilisation avancée : filtrage de fichiers spécifiques

Exemple

try (Stream<Path> stream = Files.list(Paths.get("/projects"))) {
    stream.filter(path -> path.toString().endsWith(".java"))
          .forEach(System.out::println);
} catch (IOException e) {
    e.printStackTrace();
}

Conversion vers d'autres collections

Exemple

try (Stream<Path> stream = Files.list(Paths.get("/images"))) {
    List<Path> imageFiles = stream.collect(Collectors.toList());
    // Traiter la liste des fichiers collectés
} catch (IOException e) {
    e.printStackTrace();
}

Gestion des exceptions

Files.list()La méthode peut lever les exceptions suivantes :

  1. NotDirectoryException- Lorsque le chemin n'est pas un répertoire
  2. NoSuchFileException- Lorsque le répertoire n'existe pas
  3. SecurityException- Lorsqu'il n'y a pas de permission pour lire le répertoire
  4. IOException- Lorsque d'autres erreurs d'E/S se produisent

Considérations de performance

  1. Chargement paresseux: Le flux est chargé paresseusement ; le répertoire n'est réellement lu que lorsqu'une opération terminale (telle que forEach) est exécutée
  2. Consommation de ressources: Pour les répertoires contenant un grand nombre de fichiers, l'utilisation d'un flux peut éviter de charger toutes les entrées en mémoire en une seule fois
  3. Traitement parallèle: Vous pouvez appeler laparallel()méthode pour mettre en œuvre le traitement parallèle, mais faites attention aux problèmes de sécurité des threads

Comparaison avec des méthodes similaires

Méthode Type de retour Récursivité Contient des entrées spéciales Remarques
Files.list() Stream<Path> non non Recommandé, économe en ressources
File.listFiles() File[] non non Méthode d'E/S traditionnelle
Files.walk() Stream<Path> Oui Oui Liste récursivement tout le contenu
Files.newDirectoryStream() DirectoryStream<Path> non non Doit être fermé manuellement

Bonnes pratiques

  1. Utilisez toujours try-with-resources: Assurez-vous que le flux est correctement fermé
  2. Gérez les exceptions: Gérez correctement les IOException possibles
  3. Envisagez d'utiliser des filtres: Filtrez les entrées indésirables le plus tôt possible dans les opérations de flux
  4. Évitez de modifier le répertoire: Ne modifiez pas son contenu pendant le parcours du répertoire
  5. Faites attention aux liens symboliques: Par défaut, les liens symboliques sont suivis, ce qui peut provoquer des références circulaires

Résumé

Files.list()Cette méthode est une façon moderne de gérer le contenu d'un répertoire en Java NIO, offrant tous les avantages de l'API Stream, notamment l'exécution paresseuse, les opérations chaînées et les capacités de traitement parallèle. Pour de simples besoins de listage de répertoire, elle est plus flexible et efficace que lesFile.listFiles()méthodes traditionnelles.

Java File Java java.nio.file.Files

Autres extensions