[NIO.2] 第三十三篇 遍历目录树

一旦你创建了遍历机制(实现 FileVisitor 接口或继承 SimpleFileVisitor 类),那么就可以调用 Files.walkFileTree() 方法遍历目录树。首先我们定义遍历机制:

class ListTree extends SimpleFileVisitor<Path> { 
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) {
System.out.println("Visited directory: " + dir.toString());
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) {
System.out.println(exc);

return FileVisitResult.CONTINUE;
}
}


上面这段代码将会打印遍历过的目录名。

最简单的 walkFileTree() 方法接受两个参数,第一个参数表示开始遍历的文件(通常是文件树的根),第二个参数表示遍历机制。下面我们看看如何遍历 C:\rafaelnadal 目录树:

Path listDir = Paths.get("C:/rafaelnadal"); //define the starting file tree 
ListTree walk = new ListTree(); //instantiate the walk

try{
Files.walkFileTree(listDir, walk); //start the walk
} catch(IOException e){
System.err.println(e);
}


walkFileTree() 还有一个比较复杂的重载方法,参数为:开始文件、自定义遍历选项、目录访问深度(为了确保遍历所有目录,可以设置 Integer.MAX_VALUE)、遍历机制。自定义选项值中可以使用 FileVisitOption 枚举类型,实际上这个枚举中只有一个常量 ,名为 FOLLOW_LINKS,表示在遍历的时候软链接将会被处理为目标文件(默认情况下,软链接不会被处理)。

调用这个方法的例子如下:

Path listDir = Paths.get("C:/rafaelnadal");              //define the starting file 
ListTree walk = new ListTree(); //instantiate the walk
EnumSet opts = EnumSet.of(FileVisitOption.FOLLOW_LINKS); //follow links

try{
Files.walkFileTree(listDir, opts, Integer.MAX_VALUE, walk); //start the walk
} catch(IOException e){
System.err.println(e);
}


注:调用 walkFileTree(start, visitor) 和调用 walkFileTree(start,
EnumSet.noneOf(FileVisitOption.class), Integer.MAX_VALUE, visitor) 的效果是一样的。

上面代码运行后可能的输出为:

Visited directory: C:\rafaelnadal\equipment 
Visited directory: C:\rafaelnadal\grandslam\AustralianOpen
Visited directory: C:\rafaelnadal\grandslam\RolandGarros
Visited directory: C:\rafaelnadal\grandslam\USOpen
Visited directory: C:\rafaelnadal\grandslam\Wimbledon
Visited directory: C:\rafaelnadal\grandslam

Visited directory: C:\rafaelnadal


文章来源:[url]http://www.aptusource.org/2014/04/nio-2-recursive-process/[/url]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值