Java Code For Getting A List of Files From A FileSet
Created May 7, 2012
Erik Hatcher Directly from Java Development with Ant:
19.5 OPERATING ON A FILESET
Ant's datatypes make writing tasks that deal with many of the typical Java build
domain objects such as paths and filesets much simpler. If you are writing a task to
process files in a single directory tree and would like your task to act as an implicit
fileset, the base class
Using MatchingTask provides some nice freebies that mirror the <fileset> datatype:
org.apache.tools.ant.taskdefs.MatchingTask
can
save a lot of work. Listing 19.4 shows a task to process a set of files.
package org.example.antbook.tasks; import java.io.File; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.DirectoryScanner; import org.apache.tools.ant.Task; import org.apache.tools.ant.Project; import org.apache.tools.ant.taskdefs.MatchingTask; public class FileProcTask extends MatchingTask { private File dir; public void setDir (File dir) { this.dir = dir; } public void execute() throws BuildException { if (dir == null) { throw new BuildException("dir must be specified"); } log("dir = " + dir, Project.MSG_DEBUG); DirectoryScanner ds = getDirectoryScanner(dir); String[] files = ds.getIncludedFiles(); for (int i = 0; i < files.length; i++) { log("file: " + files[i]); } dir = null; } }Listing 19.4 A task to act upon an implicit fileset
Using MatchingTask provides some nice freebies that mirror the <fileset> datatype:
- includes/excludes attributes
- defaultexcludes attribute
- <include>/<exclude> / <includesfile> / <excludesfile> elements <patternset> element
setDir
method and required
that a dir
attribute be specified by throwing a BuildException
in execute if it
was not specified. The MatchingTask base class provides a getDirectoryScanner(
File baseDir)
method to get a DirectoryScanner instance, taking into
account all the specified inclusion and exclusion rules.
Although many Ant tasks are derived from MatchingTask, the current trend is
away from this task; explicit filesets have proven to be more flexible. If you are writing
your own task, the ease of using MatchingTask as a base class still makes it appealing.
Tasks that extend from MatchingTask should only deal with a single implicit fileset.
Tasks that need to support multiple nested filesets should extend from Task instead.