Java 创建目录树

Java 创建目录树,java,path,tree,directory,traversal,Java,Path,Tree,Directory,Traversal,对于一个程序,我试图创建一个目录树。因此,我的程序的第一部分使用路径遍历我需要的目录: public static void main(String[] args) throws IOException { Path startingDir = Paths.get("/home/somedirectory"); PrintFiles pf = new PrintFiles(); Files.walkFileTree(startingDir, pf); } 和Print

对于一个程序,我试图创建一个目录树。因此,我的程序的第一部分使用路径遍历我需要的目录:

public static void main(String[] args) throws IOException {
    Path startingDir = Paths.get("/home/somedirectory");
    PrintFiles pf = new PrintFiles();
    Files.walkFileTree(startingDir, pf);

}
和PrintFiles程序(我直接从如何使用路径行走树的指南中复制了这个):

公共静态类PrintFiles扩展了SimpleFileVisitor{
//打印关于每种文件类型的信息。
@凌驾
公共文件VisitResult visitFile(路径文件,基本文件属性属性属性){
if(attr.isSymbolicLink()){
System.out.format(“符号链接:%s”,文件);
}else if(attr.isRegularFile()){
System.out.format(“常规文件:%s”,文件);
}否则{
System.out.format(“其他:%s”,文件);
}
System.out.println(“(“+attr.size()+”字节)”);
继续返回;
}
//打印访问的每个目录。
@凌驾
公共文件VisitResult postVisitDirectory(路径目录,IOException exc){
System.out.format(“目录:%s%n”,目录);
继续返回;
}
公共文件VisitResult visitFileFailed(路径文件,IOException exc){
系统错误打印项次(exc);
继续返回;
}
}

我还有一个通用的树程序,它可以创建一个包含任意数量节点的树,具有典型的add nodes remove nodes等函数(我不打算发布代码,因为它很长,而且我认为它不是真正必要的,因为它是一个非常标准的实现)

我的问题是,我应该如何创建一个通用树来表示我的特定目录的目录树?我对路径库和文件库的工作方式并不十分熟悉

谢谢,
Kevin

您需要实现
preVisitDirectory、postVisitDirectory和visitFile
。您需要在访问实现中保留“当前节点”

  • 在预创建新节点中,将其添加到
    currentNode
    ,然后设置
    currentNode=newNode
  • 在visitFile中创建一个新的叶节点并将其添加到
    currentNode
  • 在post集合中
    currentNode=currentNode.getParent()

所以有点像一个堆栈操作,您在
preVisit
中“push”并在
postVisit
中“pop”我理解这个算法是如何工作的,但是我如何确切地控制何时调用这些函数呢?例如,整个遍历是在walkFileTree函数中完成的,所以我需要自己实现它吗?您只需要实现FileVistor接口并将该实现传递给walkFileTree函数。它是这样走的,并在适当的时候调用你的访问者类。我会考虑使用Apache CAMONS IO FieluUTIL来执行DIR。
public static class PrintFiles extends SimpleFileVisitor<Path> {

    //Print information about each type of file.
    @Override
    public FileVisitResult visitFile(Path file, BasicFileAttributes attr) {
        if (attr.isSymbolicLink()) {
            System.out.format("Symbolic link: %s ", file);
        } else if (attr.isRegularFile()) {
            System.out.format("Regular file: %s ", file);
        } else {
            System.out.format("Other: %s ", file);
        }
        System.out.println("(" + attr.size() + "bytes)");
        return CONTINUE;
    }

 //Print each directory visited.
    @Override
    public FileVisitResult postVisitDirectory(Path dir, IOException exc) {
        System.out.format("Directory: %s%n", dir);
        return CONTINUE;
    }

    public FileVisitResult visitFileFailed(Path file, IOException exc) {
        System.err.println(exc);
        return CONTINUE;
    }