你会写两种类型。第一个是一个接口,它声明了一个方法,如果他们想使用你的walker,他们必须实现。
public interface FileAction {
void perform(File file) throws IOException;
}
另一个是walker本身:
public final class FileWalker {
public void scan(File directory, FileAction action) throws IOException {
if (!directory.isDirectory())
throw new IllegalArgumentException("Not a directory.");
File[] sub = directory.listFiles();
if (sub == null)
throw new FileNotFoundException("Failed to list directory contents.");
for (File f : sub) {
if (f.isDirectory())
scan(f, action);
else
/* This is where you invoke the implementation of the interface. */
action.perform(f);
}
}
}
您的用户将实现您声明的接口。它可以在perform()
方法的实现中做任何他们需要的事情,这将由你的文件遍历器调用:
final class SizeCalculator implements FileAction {
private long total = 0;
@Override
public void perform(File file) {
total += file.length();
}
long getTotal() {
return total;
}
}
然后他们会一起使用他们的对象和你的对象:
final class Test {
public static void main(String[] argv) throws IOException {
SizeCalculator sizer = new SizeCalculator();
FileWalker walker = new FileWalker();
File cwd = new File("");
walker.scan(cwd, sizer);
System.out.printf("Directory contains %d bytes.%n", sizer.getTotal());
}
}
如果您使用的是 Java 7,并且您的应用程序实际上是在遍历文件树,那么您应该使用NIO.2 API来遍历文件树。这里,要实现的FileVisitor
接口是核心Java库声明的接口。