【问题标题】:Creating a directory tree创建目录树
【发布时间】:2011-12-18 00:16:54
【问题描述】:

对于我正在尝试创建目录树的程序。所以我程序的第一部分使用Paths来遍历我需要的目录:

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

}

还有 PrintFiles 程序(我直接从关于如何使用路径行走一棵树的指南中复制了这个)http://download.oracle.com/javase/tutorial/essential/io/walk.html

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;
    }

}

我还有一个通用的树程序,它创建一个具有任意数量节点的树,具有典型的添加节点删除节点等功能(我不打算发布代码,因为它很长而且我不认为它真的必要的,因为它是一个非常标准的实现)。

我的问题是我该如何做一些事情,我可以创建一个通用树来代表我的特定目录的目录树?我对 Path 和 File 库的工作方式并不十分熟悉。

谢谢, 凯文

【问题讨论】:

  • 我会考虑使用 apache commons io fileutils 来遍历目录

标签: java path tree directory traversal


【解决方案1】:

您需要实现preVisitDirectory, postVisitDirectory and visitFile。而且您需要在访问实现中保留“当前节点”。

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

有点像堆栈操作,你在preVisit 中“推入”,在postVisit 中“弹出”。

【讨论】:

  • 我了解这个算法是如何工作的,但是我该如何控制何时调用这些函数呢?例如,整个遍历都是在 walkFileTree 函数中完成的,所以我需要自己实现吗?
  • 您只需要实现 FileVistor 接口并将该实现传递给 walkFileTree 函数。它会执行此操作并在适当的时间点调用您的访问者类。
猜你喜欢
  • 2011-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 2013-08-16
  • 2010-10-15
  • 2014-06-16
相关资源
最近更新 更多