我真的在寻找答案。我想创建一个只是遍历目录树的通用代码。也许它只是一个包含一个方法的静态类。没问题。对于不是目录的每个文件,它都会 。我认为为这个某事定义一个接口是要做的事情(我现在称之为FileActionInterface.performAction()
),但我不知道如何编写目录walker代码来调用它接口方法(尚不存在)。我已经看到并使用了其他Java类,它们的方法是“添加接口处理程序()”,然后该类将运行您实现的接口。如果你什么都不放,没有任何反应。
很抱歉在这里抓住正确的话。如何编写此目录步行器代码以调用抽象代码?
PS 所有这些都是很好的答案,我已经标记了它们。当类有一个类似于方法的“addInterfaceHandler()”时,它们是如何做到的?我猜这个类有它自己的接口实现,但它可能是空的。然后,当您调用add()方法时,您要么替换类的实现,要么像接口实现的数组一样添加它。
我会开始尝试你的不同解决方案。
答案 0 :(得分:1)
您将传入实现所述接口的对象。
walk方法会在该对象上调用该方法。
类似于Files.walkFileTree与FileVisitor的合作方式。
非常粗略:
public class Walker {
private Visitor v;
public Walker(Visitor v) { this.v = v; }
public walk(File dir) {
// pseudo-code
for (File f : dir.getFiles()) {
if (f.isDir()) {
walk(f);
} else {
v.performAction(f);
}
}
}
}
答案 1 :(得分:1)
class DirIterator
interface Callable
method callback(file) // abstract
end interface
method iterate (dir, callable) {
for each file in dir
if (file is Folder) then iterate(file, callable)
else callable.callback(file)
}
// example use
method main() {
callable = new Callable{callback(file) {print(file.name)}}; // specify cb for this iteration
dirIterator.iterate("root_dir_to_iterate/", callable); // start iteration
}
end class
答案 2 :(得分:1)
作为一种简单的静态方法:
static public walkTree(File dir, Visitor vis) {
for(File fil: dir.getFiles()) {
if(fil.isDirectory()) { walkTree(f,vis); }
else { vis.performAction(f); }
}
}
(假设Visitor有一个performAction方法。)
答案 3 :(得分:1)
你会写两种类型。第一个是一个接口,它声明了一个人如果想要使用你的walker就必须实现的方法。
public interface FileAction {
void perform(File file) throws IOException;
}
另一个是步行者本身:
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来遍历文件树。这里,要实现的接口是核心Java库声明的FileVisitor
接口。