Filtrage des fichiers

 

Nous avons vu que la classe File permettait de lister l'ensemble des fichiers/répertoires d'un système de fichiers.

Soit en passant par la méthode list() pour retourner l'ensemble des noms des fichiers présents.

Soit par la méthode listFiles() pour retourner l'ensemble des instances File des fichiers présents.

Mais généralement, nous n'avons pas besoin de l'ensemble de ces fichiers, mais uniquement une partie. Evidemment, nous n'aurons pas besoin de filtrer en sortie de ces méthodes le résultat, mais nous pourrons le faire directement lors de la constitution de ces listes.

 

Filtrer les listes

Pour filtrer les listes, nous devrons nous construire une classe qui implémentera un filtre.

Cette classe devra ensuite posséder une méthode accept qui indiquera en retour que l'on accpete (true) ou non (false) le fichier en entrée.

 

Il existe deux implémentations possible:

java.io.FilenameFilter

avec la méthode boolean accept(File repFiltre, String nom)
Avec ce filtre, nous pourrons filtrer par rapport au nom du fichier.

Reste quand même à coder le filtrage sur le nom. Nous aurons plusieurs solutions comme passer par l'utilisation d'expressions régulières, les tokens, ou plus simplement ce que permet de faire la classe String. Tout dépendra de la complexité de ce que vous voudrez faire !

Dans tous les cas, la méthode accept devra retourner true pour indiquer qu'il faut garder le fichier, ou false pour ne pas le prendre en compte dans la liste de sortie.

java.io.FileFilter

boolean accept(File fichier)
Avec ce filtre, nous pourrons filtrer par rapport aux attributs du fichier puisque nous recevons une instance de type File (quoique le par le nom reste possible par exemple par File.getName()).

Image non trouvée ! FileFilter n'est utilisable que par la méthode listFiles() de la classe File.

Là encore, dans tous les cas, la méthode accept devra retourner true pour indiquer qu'il faut garder le fichier, ou false pour ne pas le prendre en compte dans la liste de sortie.

 

Retour sur la classe File

C'est toujours list et listFiles de la classe File qui devront être appelées pour retourner les listes de fichiers. Mais il faudra simplement indiquer à ces méthodes une instance sur la classe de filtrage que vous voulez utiliser en paramètre d'entrée.

D'où les méthodes suivantes:

String [] list(FilenameFilter filter)

File [] listFiles(FileFilter filter) ou
File [] listFiles(FilenameFilter filter)

 

Exemple de code

Dans ce code, nous allons lister tous les fichiers nommés monfichier (insensible à la casse) et dont l'extension est composé de deux digits.

Image non trouvée ! Cet exemple est un peu compliqué, car il met en oeuvre deux autres solutions:

- La classe File (indispensable !)

- Les expressions régulières pour le filtrage effectif des fichiers (facultatif).