Java NIO.2 使用Files类遍历文件夹

 

在之前的Java版本中,若是要遍历某个文件夹下全部的子文件、子文件夹,须要咱们本身写递归,很麻烦。ide

 

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

 

大体用法:post

 1     Path path=Paths.get("D:\\二次元");
 2         
 3         Files.walkFileTree(path,new FileVisitor<Path>(){
 4 
 5             //访问文件夹以前自动调用此方法
 6             @Override
 7             public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
 8                 return null;
 9             }
10 
11             //访问文件时自动调用此方法
12             @Override
13             public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
14                 return null;
15             }
16 
17             //访问文件失败时自动调用此方法
18             @Override
19             public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
20                 return null;
21             }
22 
23             //访问文件夹以后自动调用此方法
24             @Override
25             public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
26                 return null;
27             }
28         });



Files.walkFileTree(Path  path, FileVisitor visitor);     spa

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

 

FileVisitor是一个接口,须要实现4个方法。固然咱们可使用适配器 SimpleFileVisitor 类,只重写咱们须要的方法。code

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

  • CONTINUE     继续访问(/遍历)
  • TERMINATE    中止访问(/遍历)
  • SKIP_SUBTREE    继续访问,但不访问此文件/文件夹的子目录树
  • SKIP_SIBLINGS     继续访问,但不访问此文件/文件夹的兄弟文件/文件夹。

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

 

 

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

 1     Path path=Paths.get("D:\\二次元");
 2 
 3         Files.walkFileTree(path,new FileVisitor<Path>(){
 4 
 5             //访问文件夹以前自动调用此方法
 6             @Override
 7             public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
 8                 System.out.println(dir.getFileName());
 9                 return FileVisitResult.CONTINUE;
10             }
11 
12             //访问文件时自动调用此方法
13             @Override
14             public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
15                 System.out.println(file.getFileName());
16                 return FileVisitResult.CONTINUE;
17             }
18 
19             //访问文件失败时自动调用此方法
20             @Override
21             public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
22                 return FileVisitResult.CONTINUE;
23             }
24 
25             //访问文件夹以后自动调用此方法
26             @Override
27             public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
28                 return FileVisitResult.CONTINUE;
29             }
30         });

 

 

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

 

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

 

 

 

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

Collection  Collections

Array    Arrays

File    Files

FileSystem   FileSystems

相关文章
相关标签/搜索