web-dev-qa-db-fra.com

Utilisation de File.listFiles avec FileNameExtensionFilter

Je voudrais obtenir une liste de fichiers avec une extension spécifique dans un répertoire. Dans l'API (Java 6), je vois une méthode File.listFiles(FileFilter) qui ferait cela.

Comme j'ai besoin d'une extension spécifique, j'ai créé un FileNameExtensionFilter. Cependant, je reçois une erreur de compilation lorsque j'utilise listFiles avec cela. J'ai supposé que depuis FileNameExtensionFilter implements FileFilter, Je devrais pouvoir le faire. Le code suit:

FileNameExtensionFilter filter = new FileNameExtensionFilter("text only","txt");
String dir  = "/users/blah/dirname";
File f[] = (new File(dir)).listFiles(filter);

La dernière ligne montre une erreur de compilation:

la méthode listFiles (FileNameFilter) dans le type Le fichier n'est pas applicable pour les arguments de type FileNameExtensionFilter

J'essaie d'utiliser listFiles(FileFilter), pas listFiles(FileNameFilter). Pourquoi le compilateur ne le reconnaît-il pas?

Cela fonctionne si j'écris mon propre filtre d'extension qui s'étend sur FileFilter. Je préférerais utiliser FileNameExtensionFilter que d’écrire le mien. Qu'est-ce que je fais mal?

74
Anu

La classe FileNameExtensionFilter est destinée à Swing pour être utilisée dans un JFileChooser .

Essayez d’utiliser un FilenameFilter . Par exemple:

File dir = new File("/users/blah/dirname");
File[] files = dir.listFiles(new FilenameFilter() {
    public boolean accept(File dir, String name) {
        return name.toLowerCase().endsWith(".txt");
    }
});
175
WhiteFang34

Y a-t-il une raison spécifique pour laquelle vous souhaitez utiliser FileNameExtensionFilter? Je sais que ça marche ..

private File[] getNewTextFiles() {
    return dir.listFiles(new FilenameFilter() {
        @Override
        public boolean accept(File dir, String name) {
            return name.toLowerCase().endsWith(".txt");
        }
    });
}
27
CFreiner

One-Liner in Java 8 syntaxe:

pdfTestDir.listFiles((dir, name) -> name.toLowerCase().endsWith(".txt"));
24
Serġan

Voici quelque chose que je viens de faire rapidement et qui devrait fonctionner beaucoup mieux que File.getName (). EndsWith (". Xxxx");

import Java.io.File;
import Java.io.FileFilter;

public class ExtensionsFilter implements FileFilter 
{
    private char[][] extensions;

    private ExtensionsFilter(String[] extensions)
    {
        int length = extensions.length;
        this.extensions = new char[length][];
        for (String s : extensions)
        {
            this.extensions[--length] = s.toCharArray();
        }
    }

    @Override
    public boolean accept(File file)
    {
        char[] path = file.getPath().toCharArray();
        for (char[] extension : extensions)
        {
            if (extension.length > path.length)
            {
                continue;
            }
            int pStart = path.length - 1;
            int eStart = extension.length - 1;
            boolean success = true;
            for (int i = 0; i <= eStart; i++)
            {
                if ((path[pStart - i] | 0x20) != (extension[eStart - i] | 0x20))
                {
                    success = false;
                    break;
                }
            }
            if (success)
                return true;
        }
        return false;
    }
}

Voici un exemple pour différents formats d'images.

private static final ExtensionsFilter IMAGE_FILTER = 
      new ExtensionsFilter(new String[] {".png", ".jpg", ".bmp"});
1
Jeremy Trifilo

Duh .... listFiles nécessite Java.io.FileFilter. FileNameExtensionFilter étend javax.swing.filechooser.FileFilter. J'ai résolu mon problème en implémentant une instance de Java.io.FileFilter

Edit: J'ai utilisé quelque chose de similaire à la réponse de @ cFreiner. J'essayais d'utiliser une méthode API Java au lieu d'écrire ma propre implémentation, raison pour laquelle j'essayais d'utiliser FileNameExtensionFilter. J'ai beaucoup de FileChoosers dans mon application et j'ai utilisé à tort FileNameExtensionFilters pour cela et j'ai eu tort. supposé qu’il étendait également Java.io.FileFilter.

1
Anu

Avec Java lambdas (disponible depuis Java 8), vous pouvez simplement convertir javax.swing.filechooser.FileFilter à Java.io.FileFilter en une seule ligne.

javax.swing.filechooser.FileFilter swingFilter = new FileNameExtensionFilter("jpeg files", "jpeg");
Java.io.FileFilter ioFilter = file -> swingFilter.accept(file);
new File("myDirectory").listFiles(ioFilter);
1
Marcin Mikosik