Использование File.listFiles с FileNameExtensionFilter - PullRequest
72 голосов
/ 22 апреля 2011

Я хотел бы получить список файлов с определенным расширением в каталоге. В API (Java 6) я вижу метод File.listFiles(FileFilter), который сделает это.

Поскольку мне нужно конкретное расширение, я создал FileNameExtensionFilter. Однако я получаю ошибку компиляции, когда я использую listFiles с этим. Я предполагал, что с FileNameExtensionFilter implements FileFilter я смогу это сделать. Код следует:

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

Последняя строка показывает ошибку компиляции:

метод listFiles (FileNameFilter) в типе File не применим для аргументов типа FileNameExtensionFilter

Я пытаюсь использовать listFiles(FileFilter), а не listFiles(FileNameFilter). Почему компилятор не распознает это?

Это работает, если я напишу свой собственный фильтр расширений, расширяющий FileFilter. Я предпочел бы использовать FileNameExtensionFilter, чем написать свой. Что я делаю не так?

Ответы [ 6 ]

174 голосов
/ 22 апреля 2011

Класс FileNameExtensionFilter предназначен для Swing для использования в JFileChooser.

Попробуйте вместо этого использовать FilenameFilter. Например:

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");
    }
});
27 голосов
/ 22 апреля 2011

Есть ли конкретная причина, по которой вы хотите использовать FileNameExtensionFilter? Я знаю, что это работает ..

private File[] getNewTextFiles() {
    return dir.listFiles(new FilenameFilter() {
        @Override
        public boolean accept(File dir, String name) {
            return name.toLowerCase().endsWith(".txt");
        }
    });
}
23 голосов
/ 26 февраля 2017

Однострочник в java 8 синтаксис:

pdfTestDir.listFiles((dir, name) -> name.toLowerCase().endsWith(".txt"));
1 голос
/ 01 июня 2017

С помощью java lambdas (доступно с версии 8) вы можете просто конвертировать javax.swing.filechooser.FileFilter в java.io.FileFilter в одну строку.

javax.swing.filechooser.FileFilter swingFilter = new FileNameExtensionFilter("jpeg files", "jpeg");
java.io.FileFilter ioFilter = file -> swingFilter.accept(file);
new File("myDirectory").listFiles(ioFilter);
1 голос
/ 02 ноября 2012

Вот то, что я быстро только что сделал, и оно должно работать намного лучше, чем File.getName (). EndWith (". 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;
    }
}

Вот пример для различных форматов изображений.

private static final ExtensionsFilter IMAGE_FILTER = 
      new ExtensionsFilter(new String[] {".png", ".jpg", ".bmp"});
1 голос
/ 22 апреля 2011

Дух .... listFiles требует java.io.FileFilter.FileNameExtensionFilter расширяет javax.swing.filechooser.FileFilter.Я решил свою проблему, реализовав экземпляр java.io.FileFilter

Правка: я использовал нечто похожее на ответ @ cFreiner.Я пытался использовать метод Java API вместо написания своей собственной реализации, поэтому я пытался использовать FileNameExtensionFilter.У меня есть много FileChoosers в моем приложении, и я использовал FileNameExtensionFilters для этого, и я ошибочно предположил, что он также расширяет java.io.FileFilter.

...