This package defines an interface (IOFileFilter) that combines both {@link java.io.FileFilter} and {@link java.io.FilenameFilter}. Besides that the package offers a series of ready-to-use implementations of the IOFileFilter interface including implementation that allow you to combine other such filters.

These filter can be used to list files or in {@link java.awt.FileDialog}, for example.

There are a number of 'primitive' filters:
DirectoryFilter Only accept directories
PrefixFileFilter Filter based on a prefix
SuffixFileFilter Filter based on a suffix
NameFileFilter Filter based on a filename
WildcardFileFilter Filter based on wildcards
AgeFileFilter Filter based on last modified time of file
SizeFileFilter Filter based on file size
And there are five 'boolean' filters:
TrueFileFilter Accept all files
FalseFileFilter Accept no files
NotFileFilter Applies a logical NOT to an existing filter
AndFileFilter Combines two filters using a logical AND
OrFileFilter Combines two filter using a logical OR

Using Classic IO

These boolean FilenameFilters can be nested, to allow arbitrary expressions. For example, here is how one could print all non-directory files in the current directory, starting with "A", and ending in ".java" or ".class":

  File dir = new File(".");
  String[] files = dir.list( 
    new AndFileFilter(
      new AndFileFilter(
        new PrefixFileFilter("A"),
        new OrFileFilter(
          new SuffixFileFilter(".class"),
          new SuffixFileFilter(".java")
        )
      ),
      new NotFileFilter(
        new DirectoryFileFilter()
      )
    )
  );
  for (int i=0; i<files.length; i++) {
    System.out.println(files[i]);
  }

You can alternatively build a filter tree using the "and", "or", and "not" methods on filters themselves:

  File dir = new File(".");
  String[] files = dir.list( 
    new AndFileFilter(
      new PrefixFileFilter("A").and(
        new SuffixFileFilter(".class").or(new SuffixFileFilter(".java"))),
      new DirectoryFileFilter().not()
    )
  );
  for (int i=0; i<files.length; i++) {
    System.out.println(files[i]);
  }

This package also contains a utility class: FileFilterUtils. It allows you to use all file filters without having to put them in the import section. Here's how the above example will look using FileFilterUtils:

  File dir = new File(".");
  String[] files = dir.list( 
    FileFilterUtils.andFileFilter(
      FileFilterUtils.andFileFilter(
        FileFilterUtils.prefixFileFilter("A"),
        FileFilterUtils.orFileFilter(
          FileFilterUtils.suffixFileFilter(".class"),
          FileFilterUtils.suffixFileFilter(".java")
        )
      ),
      FileFilterUtils.notFileFilter(
        FileFilterUtils.directoryFileFilter()
      )
    )
  );
  for (int i=0; i<files.length; i++) {
    System.out.println(files[i]);
  }

Using NIO

You can combine Java file tree walking by using java.nio.file.Files.walk() APIs with filters:

   final Path dir = Paths.get("");
   // We are interested in files older than one day
   final long cutoff = System.currentTimeMillis() - (24 * 60 * 60 * 1000);
   final AccumulatorPathVisitor visitor = AccumulatorPathVisitor.withLongCounters(new AgeFileFilter(cutoff));
   //
   // Walk one dir
   Files.walkFileTree(dir, Collections.emptySet(), 1, visitor);
   System.out.println(visitor.getPathCounters());
   System.out.println(visitor.getFileList());
   //
   visitor.getPathCounters().reset();
   //
   // Walk dir tree
   Files.walkFileTree(dir, visitor);
   System.out.println(visitor.getPathCounters());
   System.out.println(visitor.getDirList());
   System.out.println(visitor.getFileList());

There are a few other goodies in that class so please have a look at the documentation in detail.