web-dev-qa-db-fra.com

Utilisation de FilenameFilter

J'ai un répertoire:

File dir = new File(MY_PATH);

Je voudrais énumérer tous les fichiers dont le nom est indiqué sous forme de chaîne de nombres entiers, par exemple. "10", "20". 
Je sais que je devrais utiliser:

dir.list(FilenameFilter filter);

Comment définir ma FilenameFilter

P.S. Je veux dire que le nom du fichier peut être n’importe quelle chaîne entière, par exemple. "10" ou "2000000" ou "3452345". Aucune restriction quant au nombre de chiffres tant que le nom du fichier est une chaîne entière.

11
Leem.fin

Vous devez overrideaccept dans interfaceFilenameFilter et vous assurer que le paramètre name ne comporte que des caractères numériques. Vous pouvez vérifier cela en utilisant matches :

String[] list = dir.list(new FilenameFilter() {
    @Override
    public boolean accept(File dir, String name) {
        return name.matches("[0-9]+");
    }
});
27
Maroun

de préférence en tant qu'instance d'une classe interne anonyme passée en paramètre à File # list .

par exemple, pour ne répertorier que les fichiers se terminant par l'extension .txt:

File dir = new File("/home");
String[] list = dir.list(new FilenameFilter() {
    @Override
    public boolean accept(File dir, String name) {
        return name.toLowerCase().endsWith(".txt");
    }
});

Pour répertorier uniquement les fichiers dont les noms de fichier sont des entiers comportant exactement 2 chiffres, vous pouvez utiliser les éléments suivants dans la méthode accept:

return name.matches("\\d{2}");

pour un ou plusieurs chiffres:

return name.matches("\\d+");    

EDIT (en réponse au commentaire de @ crashprophet)

Passer un ensemble d'extensions de fichiers à lister

class ExtensionAwareFilenameFilter implements FilenameFilter {

    private final Set<String> extensions;

    public ExtensionAwareFilenameFilter(String... extensions) {
        this.extensions = extensions == null ? 
            Collections.emptySet() : 
                Arrays.stream(extensions)
                    .map(e -> e.toLowerCase()).collect(Collectors.toSet());
    }

    @Override
    public boolean accept(File dir, String name) {
        return extensions.isEmpty() || 
            extensions.contains(getFileExtension(name));
    }

    private String getFileExtension(String filename) {
        String ext = null;
        int i = filename .lastIndexOf('.');
        if(i != -1 && i < filename .length()) {
            ext = filename.substring(i+1).toLowerCase();
        }
        return ext;
    }
}


@Test
public void filefilter() {
    Arrays.stream(new File("D:\\downloads").
        list(new ExtensionAwareFilenameFilter("pdf", "txt")))
            .forEach(e -> System.out.println(e));
}
5
A4L

Je le fais comme:

    File folder = new File(".");
    File[] listOfFiles = folder.listFiles();
    for (File file : listOfFiles) {
        if (file.isFile()) {
            if (file.toString().endsWith(".sql")) {
                System.out.println(file.getName());
            }
        }
    }
    System.out.println("End!!");
1
user2607028

Depuis Java 8, vous pouvez simplement utiliser une expression lambda pour spécifier votre filtre personnalisé:

dir.list((dir1, name) -> name.equals("foo"));

Dans l'exemple ci-dessus, seuls les fichiers portant le nom "foo" seront acceptés. Utilisez votre propre logique bien sûr.

1
Grzegorz Piwowarek