有没有更好的方法为许多分机做filefilter?

时间:2009-05-14 18:50:30

标签: java string file-io filter

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 个答案:

答案 0 :(得分:16)

对于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);
    }
});

答案 1 :(得分:5)

为什么不使用正则表达式?

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

然后return p.matcher(name).find();

答案 2 :(得分:5)

一些伪代码解决方案:

遍历数组

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

答案 3 :(得分:1)

我刚刚写完这堂课:

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"));

BTW这是一个可重复使用的类,您甚至可以使用装饰器模式等进行额外检查来包装它。

<强> PS

刚刚注意到FileNameExtensionFilter

的存在

答案 4 :(得分:1)

您可以使用静态初始化的HashSet执行以下操作。就个人而言,我会将允许的扩展名放到某种配置文件中,以使其更容易更改,但您不必这样做。

n.b。 FilenameUtils 属于 Commons I / O ,其中还包含一系列类,可以让您更轻松地完成这类工作。看看 FileFilterUtils ,这进一步简化了事情并提供了一些不错的帮助方法。

private static Set allowedExtensions = 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/

答案 5 :(得分:0)

您可以静态创建地图,如果文件扩展名是地图中的键,则返回true。

或者您可以尝试将文件名与正则表达式匹配(但我会选择使用地图)。

答案 6 :(得分:0)

这是我的方法。 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('.')));

    }
});

// ...