Использование File.listFiles с FileNameExtensionFilter

Я хотел бы получить список файлов с определенным расширением в каталоге. В 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) в типе Файл не применим для аргументов типа FileNameExtensionFilter

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

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

Класс 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"); } }); 

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

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

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

 pdfTestDir.listFiles((dir, name) -> name.toLowerCase().endsWith(".txt")); 

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

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

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

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

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

С java lambdas (доступным с java 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); 
  • Запуск пользовательского приложения для Android от браузера android
  • Каков наилучший способ фильтрации коллекции Java?
  • Запуск пользовательского приложения Android из браузера Android / Chrome
  • Отчеты фильтрации jqGrid
  • Как создать RESTful поиск / фильтрацию?
  • как реализовать фильтрацию в RealmRecyclerViewAdapter
  • Как использовать фильтр объектов с поддержкой softlayer api?
  • Фильтрация DataGridView без изменения источника данных
  • Как фильтровать данные jqGrid НЕ используя встроенный блок поиска / фильтра
  • Как динамически обновлять ListView на Android
  • Добавить фильтр на RecyclerView с карточками?
  • Interesting Posts

    В чем разница между: first-child и: first-of-type?

    Увеличение пространства кучи в Eclipse: (java.lang.OutOfMemoryError)

    Как добавить fragment в программно сгенерированный макет?

    Потоковое голосование между телефонами Android через WiFi

    Включая другой class в SCSS

    Как заблокировать запуск двух экземпляров одной и той же программы?

    Получить указатель функции из std :: function при использовании std :: bind

    static_assert зависит от параметра шаблона непигового типа (различное поведение на gcc и clang)

    Что такое 1e100.net и почему у меня открыты порты TCP?

    Данные о сердечном ритме на яблоне

    Как открыть раздел реестра WOW64 из 64-разрядного приложения .NET

    Как получить контакты из родной телефонной книги в Android

    Как CountDownLatch используется в многопоточности Java?

    Заполнение пустой таблицы данными из таблицы oter на основе выбора списка

    Возможно ли установить конкретный каталог на сервере Linux на локальную машину Windows?

    Давайте будем гением компьютера.