DirectoryWalker类
DirectoryWalker类主要用于处理遍历文件目录操作的类,在遍历文件目录的过程中可以对文件或文件夹做相应处理(添加钩子)。DirectoryWalker类是一个抽象类,使用的需要创建这个类的子类。这个类需要制定一个泛型参数,作为返回结果的类型。
类中的一些主要的函数:
- handleStart 遍历处理开始时触发的函数
- handleEnd 遍历处理结束时触发的函数
- handleDirectory 遍历过程中如果是目录,则触发该函数
- handleFile 遍历过程中如果是文件,则触发该函数
- handleDirectoryStart 处理目录开始时触发的函数
- handleDirectoryEnd 处理目录结束时触发的函数
- filterDirectoryContents 自定义过滤目录中的文件
- walk 开始遍历文件目录的函数,并返回处理的列表。有个一重载的walk函数,内部的实现方式就使用递归的方法去遍历子目录。
下面是一个简单遍历文件夹下所有文件名的例子:
static class ListFileWorker extends DirectoryWalker<File>{
List<File> list(File startDirectory) throws IOException {
ArrayList<File> files = new ArrayList<File>();
walk(startDirectory, files);
return files;
}
@Override
protected void handleFile(File file, int depth, Collection<File> results)throws IOException {
results.add(file);//文件名直接添加到返回结果列表
}
}
main函数:
public static void main(String[] args) {
ListFileWorker worker = new ListFileWorker();
try {
List<File> files = worker.list(new File("C:\Python27"));
for (File file : files) {
System.out.println(file);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
当然也可以添加FileFilter过滤掉文件夹或目录,这样就不会遍历那些被过滤掉的文件或者目录。
下面一个例子是中官方源代码中自带的测试用例中的代码:
/**
* DirectoryWalker implementation that recursively lists all files and directories.
*/
static class ListDirectoryWalker extends DirectoryWalker<File> {
ListDirectoryWalker() {
super();
}
List<File> list(File startDirectory) throws IOException {
ArrayList<File> files = new ArrayList<File>();
walk(startDirectory, files);
return files;
}
@Override
protected void handleDirectoryStart(File directory, int depth, Collection<File> results) throws IOException {
// Add all directories except the starting directory
//遇到目录的时候也把目录加到结果列表中
if (depth > 0) {
results.add(directory);
}
}
@Override
protected void handleFile(File file, int depth, Collection<File> results) throws IOException {
results.add(file);
}
}
下面给出java doc中给出的一些例子:
//FileCleaner.java
//遍历目录,删除.svn目录(和其子文件)
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.apache.commons.io.DirectoryWalker;
public class FileCleaner extends DirectoryWalker {
public FileCleaner() {
super();
}
public List clean(File startDirectory) throws IOException {
List results = new ArrayList();
walk(startDirectory, results);
return results;
}
protected boolean handleDirectory(File directory, int depth,
Collection results) {
// delete svn directories and then skip
if (".svn".equals(directory.getName())) {
directory.delete();
return false;
} else {
return true;
}
}
protected void handleFile(File file, int depth, Collection results) {
// delete file and add to list of deleted
file.delete();
results.add(file);
}
}
添加FileFilter的推荐方法:
public class FooDirectoryWalker extends DirectoryWalker {
//dirFilter目录过滤器,fileFilter文件类型过滤器
public FooDirectoryWalker(IOFileFilter dirFilter, IOFileFilter fileFilter) {
super(dirFilter, fileFilter, -1);
}
}
// Use the filters to construct the walker
FooDirectoryWalker walker = new FooDirectoryWalker(
HiddenFileFilter.VISIBLE,
FileFilterUtils.suffixFileFilter(".txt"),
);