我想弄清楚如何使用 Apache Commons IO DirectoryWalker
。很容易理解如何子类化DirectoryWalker
.
但是如何开始在特定目录上执行它呢?
我想弄清楚如何使用 Apache Commons IO DirectoryWalker
。很容易理解如何子类化DirectoryWalker
.
但是如何开始在特定目录上执行它呢?
只是为了扩展这个答案,因为我一开始也对如何使用这个类感到困惑,当我环顾四周时,这个问题出现在谷歌上。这只是我如何使用它的一个例子(减去一些东西):
public class FindConfigFilesDirectoryWalker extends DirectoryWalker {
private static String rootFolder = "/xml_files";
private Logger log = Logger.getLogger(getClass());
private static IOFileFilter filter = FileFilterUtils.andFileFilter(FileFilterUtils.fileFileFilter(),
FileFilterUtils.suffixFileFilter("xml"));
public FeedFileDirectoryWalker() {
super(filter, -1);
}
@SuppressWarnings("unchecked")
@Override
protected void handleFile(final File file, final int depth, final Collection results) throws IOException {
log.debug("Found file: " + file.getAbsolutePath());
results.add(file);
}
public List<File> getFiles() {
List<File> files = new ArrayList<File>();
URL url = getClass().getResource(rootFolder);
if (url == null) {
log.warn("Unable to find root folder of configuration files!");
return files;
}
File directory = new File(url.getFile());
try {
walk(directory, files);
}
catch (IOException e) {
log.error("Problem finding configuration files!", e);
}
return files;
}
}
然后您只需通过您创建的公共方法调用它,并传入您可能需要的任何参数:
List<File> files = new FindConfigFilesDirectoryWalker().getFiles();
看起来子类应该提供一个调用 walk() 的公共方法。
我想要的只是要迭代的目录集合。这个子类提供了我需要的东西:
public class UDirWalker extends DirectoryWalker {
public UDirWalker() {
super();
}
public ArrayList<File> getDirectories(File startDirectory) throws IOException {
ArrayList<File> dirs = new ArrayList<File>();
walk(startDirectory, dirs);
return dirs;
}
@Override
protected boolean handleDirectory(File directory, int depth,
Collection results) {
results.add(directory);
return true;
}
}