В чем преимущество FileFilter / FilenameFilter - PullRequest
3 голосов
/ 15 декабря 2010

Работая над небольшим инструментом Java, чтобы получить набор файлов на основе набора расширений имен файлов, я спорю между использованием listFiles () и использованием continue;, когда я сталкиваюсь с плохим файлом, и использованием пользовательского FileFilter.или FilenameFilter, чтобы сделать то же самое для меня.

Мне кажется, что эти методы являются удобными методами для интегрированных инструментов, таких как просмотр файлов Swing, и не более эффективны, чем ручной метод, если мы не подключаемся клюбой из этих инструментов.Это верно?Есть ли какие-либо другие преимущества для этих инструментов фильтра?

Ответы [ 4 ]

2 голосов
/ 15 декабря 2010

Из источника JDK 1.6:

public String[] list(FilenameFilter filter) {
    String names[] = list();
    if ((names == null) || (filter == null)) {
        return names;
    }
    ArrayList v = new ArrayList();
    for (int i = 0 ; i < names.length ; i++) {
        if (filter.accept(this, names[i])) {
            v.add(names[i]);
        }
    }
    return (String[])(v.toArray(new String[v.size()]));
}

Итак, как вы можете видеть, в основном, здесь делается то же самое, что вы делаете с ручным тестом.Единственное, что это приносит вам - это не нужно изобретать велосипед, и если они вдруг найдут гораздо более быстрый способ сделать это, вам не придется менять свой код:)

2 голосов
/ 15 декабря 2010

Как и любой другой API на основе интерфейсов, это позволяет многократно использовать логику. Вы можете использовать API java.io. * для поиска файлов любого типа, особенно если вы используете библиотеки, такие как Apache Commons IO:

http://commons.apache.org/io/api-1.4/org/apache/commons/io/filefilter/package-summary.html

1 голос
/ 15 декабря 2010

Да, они в основном предназначены для инструментов, которые принимают файловые фильтры (или вообще везде, где код, который определяет логику, отличается от кода, который выполняет оценку фильтра). Под капотом нет магии, они просто делают то, что вы могли бы сделать в своем собственном цикле.

0 голосов
/ 15 декабря 2010

Нет, думаю, вы правильно поняли деньги.Это удобные методы.Они просто принимают имя, (и знают расширение, которое вы установили изначально) , и проверяют, должно ли оно быть включено в список, а не нет.Во многом аналогично тому, что вы делаете.

Из документации Java:

public boolean accept(File dir, String name)

Проверяет, должен ли указанный файл быть включен в список файлов.1010 *

Это именно то, что вы делаете в любом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...