欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[NIO.2] 第三十一篇 FileVisitor 接口

程序员文章站 2022-04-28 14:08:51
...
FileVisitor 接口提供了递归遍历文件树的支持。这个接口上的方法表示了遍历过程中的关键过程,允许你在文件被访问、目录将被访问、目录已被访问、发生错误等等过程上进行控制;换句话说,这个接口在文件被访问前、访问中和访问后,以及产生错误的时候都有相应的钩子程序进行处理。

调用 FileVisitor 中的方法,会返回访问结果 FileVisitResult 对象值,用于决定当前操作完成后接下来该如何处理。FileVisitResult 的标准返回值存放到 FileVisitResult 枚举类型中:

  •     FileVisitResult.CONTINUE:这个访问结果表示当前的遍历过程将会继续。
  •     FileVisitResult.SKIP_SIBLINGS:这个访问结果表示当前的遍历过程将会继续,但是要忽略当前文件/目录的兄弟节点。
  •     FileVisitResult.SKIP_SUBTREE:这个访问结果表示当前的遍历过程将会继续,但是要忽略当前目录下的所有节点。
  •     FileVisitResult.TERMINATE:这个访问结果表示当前的遍历过程将会停止。


上面的所有枚举值可以通过下面的代码进行遍历:
for (FileVisitResult constant : FileVisitResult.values()) 
    System.out.println(constant);


接下来介绍 FileVisitor 接口上的方法。

FileVisitor.visitFile() 方法

visitFile() 将会在访问目录中的文件的时候被调用。这个方法通常返回 CONTINUE 和 TERMINATE 结果。例如,当你在搜索某个文件的时候,你需要一直返回 CONTINUE  直到文件被找到或已经搜索完所有的文件,一旦文件被找到,就返回 TERMINATE。

当这个方法被调用的时候,它接受文件引用和文件基本属性两个参数。一旦发生 I/O 错误,将会抛出  IOException 异常。下面是这个方法的签名:

FileVisitResult visitFile(T file, BasicFileAttributes attrs) throws IOException


FileVisitor.preVisitDirectory() 方法


preVisitDirectory() 在访问目录中的节点之前被调用。如果返回 CONTINUE 那么将会继续访问,如果返回 SKIP_SUBTREE(只有在这个方法中返回这个值才有意义),那么将会掉过当前目录继续访问。也可以返回  SKIP_SIBLINGS 跳过访问当前目录的所有兄弟节点。

当这个方法被调用,它将接受目录引用和目录基本属性两个参数。方法签名为:

FileVisitResult preVisitDirectory(T dir, BasicFileAttributes attrs) throws IOException


postVisitDirectory() 方法

postVisitDirectory() 将会在目录中所有节点(包括所有子节点)都被访问或访问过程立即停止(可能是发生 I/O 异常,也可能是在在程序中强制停止)的时候被调用。

当这个方法被调用的时候,它接受文件引用和 IOException 两个参数。如果没有异常产生,那么 IOException 的值将会是 null。这个方法的方法签名是:

FileVisitResult postVisitDirectory(T dir, IOException exc) throws IOException


FileVisitor.visitFileFailed() 方法

visitFileFailed() 方法将会在不能访问文件的时候被调用。不能访问文件的原因可能是没有访问权限或是目录不能打开。这个方法被调用时接受访问文件的引用和访问文件时产生的 IOException 两个参数。这个方法的方法签名如下:

FileVisitResult visitFileFailed(T file, IOException exc) throws IOException


文章来源:http://www.aptusource.org/2014/04/nio-2-filevisitor-interface/
相关标签: Java NIO.2