这里建议的其他选项都很好,但另一种选择是将多个更简单的FileFilter嵌套在一起(当然,这可能是矫枉过正的!)
public class FailFastFileFilter implements FileFilter {
protected final List children = new ArrayList();
public FailFastFileFilter(FileFilter... filters) {
for (FileFilter filter: filters) {
if (filter != null)
this.filters.add(filter);
}
}
public boolean accept(File pathname) {
for (FileFilter filter: this.filters) {
if (!filter.accept(pathname)) {
return false; // fail on the first reject
}
}
return true;
}
}
然后简单地为Sub3案例,.scl和.awl案例组合简短,简洁的FileFilters.我上面显示的示例FailFastFileFilter允许您将null指定为其中一个过滤器(因此您可以使用内联if语句来确定是否应用了特定的FileFilters)
为了完成,这里是我如何为Sub1案例和Sub3案例实现子过滤器的一般概念.
首先,过滤器用于排除目录中具有特定扩展名的文件:
public class ExcludeExtensionInDirFileFilter implements FileFilter {
protected final String parentFolder;
protected final String extension;
public ExtensionFileFilter(String parentFolder, String extension) {
this.parentFolder = parentFolder;
this.extension = extension.toLowerCase();
}
public boolean accept(File file) {
if (!file.isDirectory() && file.getParentFile().getName().equalsIgnoreCase(parentFolder))
return !file.getAbsolutePath().toLowerCase().endsWith(extension);
else
return true;
}
}
然后排除目录:
public class ExcludeDirFileFilter implements FileFilter {
protected final String name;
public ExcludeDirFileFilter(String name) {
this.name = name.toLowerCase();
}
public boolean accept(File file) {
if (file.isDirectory() && file.getName().equalsIgnoreCase(name))
return false;
else
return true;
}
}
然后设置FailFastFileFilter看起来像:
FileFilter filters = new FailFastFileFilter(
new ExcludeDirFileFilter("Sub3"), // always exclude Sub3
(!Settings.getSiemensOptionAWL() ? new ExcludeExtensionInDirFileFilter("Sub1",".awl"), null), // Exclude Sub1/*.awl if desired
(!Settings.getSiemensOptionSCL() ? new ExcludeExtensionInDirFileFilter("Sub1",".scl"), null) // Exclude Sub1/*.scl if desired
);
FileUtils.copyDirectory(srcDir, dstDir, filters);