Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there any better way to do filefilter for many ext?

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

As you can see, the code is dirty with "||"

Do you know how to make it better?

like image 730
ariso Avatar asked May 14 '09 18:05

ariso


People also ask

What is FileFilter in Java?

FileFilter is an abstract class used by JFileChooser for filtering the set of files shown to the user. See FileNameExtensionFilter for an implementation that filters using the file name extension. A FileFilter can be set on a JFileChooser to keep unwanted files from appearing in the directory listing.

What is FileNameExtensionFilter in Java?

public final class FileNameExtensionFilter extends FileFilter. An implementation of FileFilter that filters using a specified set of extensions. The extension for a file is the portion of the file name after the last ".". Files whose name does not contain a "." have no file name extension.


3 Answers

With Java 6 or above, this is a perfect case for a FileNameExtensionFilter... except that it extends javax.swing.filechooser.FileFilter instead of implementing java.io.FileFilter.
But it is trivial to write a wrapper for it:

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);
    }
});
like image 137
Michael Myers Avatar answered Nov 15 '22 19:11

Michael Myers


Why not use regular expressions?

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

and then return p.matcher(name).find();

like image 23
alamar Avatar answered Nov 15 '22 21:11

alamar


Some pseudocode solutions:

Iterate over an array

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

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

Use a set

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

nameSuffix = name.getSuffix()
if nameSuffix in suffixes:
    return True
like image 22
Georg Schölly Avatar answered Nov 15 '22 19:11

Georg Schölly