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

阅读更多
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)