java nio过滤文件夹_Java NIO.2 使用Files类遍历文件夹

在以前的Java版本中,如果要遍历某个文件夹下所有的子文件、子文件夹,需要我们自己写递归,很麻烦。

在Java7以后,我们可以NIO.2中的Files工具类来遍历某个文件夹(会自动递归)。

大致用法:

1 Path path=Paths.get("D:\\二次元");2

3 Files.walkFileTree(path,new FileVisitor(){4

5 //访问文件夹之前自动调用此方法

6 @Override7 public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throwsIOException {8 return null;9 }10

11 //访问文件时自动调用此方法

12 @Override13 public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throwsIOException {14 return null;15 }16

17 //访问文件失败时自动调用此方法

18 @Override19 public FileVisitResult visitFileFailed(Path file, IOException exc) throwsIOException {20 return null;21 }22

23 //访问文件夹之后自动调用此方法

24 @Override25 public FileVisitResult postVisitDirectory(Path dir, IOException exc) throwsIOException {26 return null;27 }28 });

Files.walkFileTree(Path  path, FileVisitor visitor);

静态方法。第一个参数指定要遍历的文件夹,第二个参数是FileVisitor对象,指定遍历时如何处理文件、文件夹。

FileVisitor是一个接口,需要实现4个方法。当然我们可以使用适配器 SimpleFileVisitor 类,只重写我们需要的方法。

4个方法的返回值类型均是FileVisitResult,FileVisitReset是一个枚举类。代表访问此文件/文件夹后的后续行为。可使用的值:

CONTINUE     继续访问(/遍历)

TERMINATE    停止访问(/遍历)

SKIP_SUBTREE    继续访问,但不访问此文件/文件夹的子目录树

SKIP_SIBLINGS     继续访问,但不访问此文件/文件夹的兄弟文件/文件夹。

需要以  FileVisitResult.  的形式引用,示例:FileVisitResult.CONTINUE

示例:输出每个文件、文件夹的名称。

1 Path path=Paths.get("D:\\二次元");2

3 Files.walkFileTree(path,new FileVisitor(){4

5 //访问文件夹之前自动调用此方法

6 @Override7 public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throwsIOException {8 System.out.println(dir.getFileName());9 returnFileVisitResult.CONTINUE;10 }11

12 //访问文件时自动调用此方法

13 @Override14 public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throwsIOException {15 System.out.println(file.getFileName());16 returnFileVisitResult.CONTINUE;17 }18

19 //访问文件失败时自动调用此方法

20 @Override21 public FileVisitResult visitFileFailed(Path file, IOException exc) throwsIOException {22 returnFileVisitResult.CONTINUE;23 }24

25 //访问文件夹之后自动调用此方法

26 @Override27 public FileVisitResult postVisitDirectory(Path dir, IOException exc) throwsIOException {28 returnFileVisitResult.CONTINUE;29 }30 });

作为根的文件夹(上例中的“二次元”)也算作一个遍历的节点。

PreVisitDirectory()、PostVisitDirectory()、VisitFile()这3个方法,不能返回null,如果返回null,编译时ok,但运行时往往会报错——空指针异常。IDEA下的代码自动完成,4个方法的默认实现都是return null,需要注意。

Java的工具类的命名一般是在对应类后面加一个s。比如:

Collection  Collections

Array    Arrays

File    Files

FileSystem   FileSystems

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值