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