2011-10-29 120 views
1

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

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

}

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

我的问题是,我该如何做一些事情,我可以创建一个通用树来表示我的特定目录的目录树?我不完全熟悉路径和文件库的工作方式。

感谢, 凯文

+1

我会考虑使用Apache公用程序io fileutils来运行目录 – jayunit100

回答

0

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

  • 在预先创建一个新的节点,将其添加到currentNode然后设置currentNode = newNode
  • 在visitFile创建一个新的叶子节点,并把它添加到currentNode
  • 在岗位设置currentNode = currentNode.getParent()

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

+0

我明白这个算法是如何工作的,但我究竟该如何控制何时调用这些函数?例如,整个遍历在walkFileTree函数内完成,那么我是否需要自己实现这个? – Matt

+0

您只需要实现FileVistor接口并将该实现传递给walkFileTree函数。它在适当的地点行走并打电话给您的访客课程。 –