Есть ли лучший способ сделать filefilter для многих ext? - PullRequest
10 голосов
/ 14 мая 2009
File files[] = rootDir.listFiles(new FileFilter() {
    public boolean accept(File file) {
        if (file.isDirectory())
            return true;

    String name = file.getName().toLowerCase();

    if (name.endsWith(".zip") || name.endsWith(".jar")
     || name.endsWith(".z") || name.endsWith(".gz")
     || name.endsWith(".tar") || name.endsWith(".bz2")
     || name.endsWith(".bz"))
        return true;

    return false;
    }
});

Как видите, код "грязный"

Ты знаешь, как сделать это лучше?

Ответы [ 7 ]

16 голосов
/ 14 мая 2009

С Java 6 или выше, это идеальный случай для FileNameExtensionFilter ... за исключением того, что он расширяет javax.swing.filechooser.FileFilter вместо реализации java.io.FileFilter.
Но написать обертку для него тривиально:

File[] files = rootDir.listFiles(new FileFilter() {
    private final FileNameExtensionFilter filter =
        new FileNameExtensionFilter("Compressed files",
            "zip", "jar", "z", "gz", "tar", "bz2", "bz");
    public boolean accept(File file) {
        return filter.accept(file);
    }
});
5 голосов
/ 14 мая 2009

Некоторые решения псевдокодов:

Итерация по массиву

suffixes = [".tar", ".zip", ".jpg"]

for suffix in suffixes:
    if name.endsWith(suffix):
        return True

Используйте набор

suffixes = [".tar", ".zip", ".jpg"]

nameSuffix = name.getSuffix()
if nameSuffix in suffixes:
    return True
5 голосов
/ 14 мая 2009

Почему бы не использовать регулярные выражения?

static final Pattern p = Pattern.compile("\\.(zip|jar|z|gz)$");

, а затем return p.matcher(name).find();

1 голос
/ 14 мая 2009

Вы можете сделать следующее, используя статически инициализированный HashSet. Лично я бы вытащил разрешенные расширения в какой-то файл конфигурации, чтобы его было легче изменить, но вам не нужно.

n.b. FilenameUtils принадлежит Commons I / O , который также включает в себя несколько классов, которые облегчают выполнение подобных задач. Взгляните также на FileFilterUtils , который еще больше упрощает ситуацию и предоставляет несколько полезных вспомогательных методов.

частный статический Set setExExsions = null;

static {
    allowedExtensions = new HashSet<String>();
    allowedExtensions.add("txt");
    allowedExtensions.add("zip");
    allowedExtensions.add("jar");
    allowedExtensions.add("gz");
}

public void filter() {
    File rootDir = new File("/");
    File files[] = rootDir.listFiles(new FileFilter() {

        public boolean accept(File file) {

            if (file.isDirectory()) return true;

            String fileName = file.getName().toLowerCase();

            String extension = FilenameUtils.getExtension(fileName);
            if (StringUtils.isNotEmpty(extension)
                && allowedExtensions.contains(extension)) {
                return true;
            } else {
                return false;
            }
        }
    });        
}

API можно найти здесь:

http://commons.apache.org/io/api-release/

1 голос
/ 14 мая 2009

Я только что закончил писать этот класс:

class FileExtensionFilter implements FileFilter {

    private final String[] validExtensions;

    public FileExtensionFilter(String... validExtensions) {
        this.validExtensions = validExtensions;
    }

    public boolean accept(File pathname) {
        if (pathname.isDirectory()) {
            return true;
        }

        String name = pathname.getName().toLowerCase();

        for (String ext : validExtensions) {
            if (name.endsWith(ext)) {
                return true;
            }
        }

        return false;
    }
}

использование:

File files[] = directory.listFiles(
                  new FileExtensionFilter(".zip", ".jar", ".z", ".tar"));

Кстати, это класс многократного использования, вы можете даже обернуть его дополнительными проверками, используя шаблон декоратора и т. Д.

PS

только что заметил существование FileNameExtensionFilter

0 голосов
/ 14 мая 2009

Вот мой подход. java.lang.Collections действительно хороший класс! И поскольку мы ищем данное расширение файла в HashSet, оно более производительно. Хотя я сомневаюсь, что производительность действительно имеет значение в этом случае ...

// ...

final Set<String> archives = new HashSet<String>();
Collections.addAll(archives, ".zip", ".jar", ".z", ".gz", ".tar",
        ".bz2", ".bz");

File files[] = rootDir.listFiles(new FileFilter() {
    public boolean accept(final File file) {
        if (file.isDirectory())
            return true;

        final String name = file.getName().toLowerCase();
        return archives.contains(name
                .substring(name.lastIndexOf('.')));

    }
});

// ...
0 голосов
/ 14 мая 2009

Вы можете статически создать карту и вернуть true, если расширение имени файла является ключом на карте.

Или вы можете попытаться сопоставить имя файла с регулярным выражением (но я бы вместо этого выбрал карту).

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