模块  java.base
软件包  java.nio.file

Interface FileVisitor<T>

  • 所有已知实现类:
    SimpleFileVisitor

    public interface FileVisitor<T>
    文件的访问者。 该接口的实现被提供给Files.walkFileTree方法以访问文件树中的每个文件。

    用法示例:假设我们要删除文件树。 在这种情况下,删除目录中的条目后,应删除每个目录。

      Path start = ...
         Files.walkFileTree(start, new SimpleFileVisitor<Path>() {
             @Override
             public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
                 throws IOException
             {
                 Files.delete(file);
                 return FileVisitResult.CONTINUE;
             }
             @Override
             public FileVisitResult postVisitDirectory(Path dir, IOException e)
                 throws IOException
             {
                 if (e == null) {
                     Files.delete(dir);
                     return FileVisitResult.CONTINUE;
                 } else {
                     // directory iteration failed
                     throw e;
                 }
             }
         }); 

    此外,假设我们要将文件树复制到目标位置。 在这种情况下,应遵循符号链接,并且应在复制目录中的条目之前创建目标目录。

      final Path source = ...
         final Path target = ...
    
         Files.walkFileTree(source, EnumSet.of(FileVisitOption.FOLLOW_LINKS), Integer.MAX_VALUE,
             new SimpleFileVisitor<Path>() {
                 @Override
                 public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs)
                     throws IOException
                 {
                     Path targetdir = target.resolve(source.relativize(dir));
                     try {
                         Files.copy(dir, targetdir);
                     } catch (FileAlreadyExistsException e) {
                          if (!Files.isDirectory(targetdir))
                              throw e;
                     }
                     return CONTINUE;
                 }
                 @Override
                 public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
                     throws IOException
                 {
                     Files.copy(file, target.resolve(source.relativize(file)));
                     return CONTINUE;
                 }
             }); 
    从以下版本开始:
    1.7
    • 方法详细信息

      • preVisitDirectory

        FileVisitResult preVisitDirectory​(T dir,
                                          BasicFileAttributes attrs)
                                   throws IOException
        在访问目录中的条目之前为目录调用。

        如果此方法返回CONTINUE ,则访问该目录中的条目。 如果此方法返回SKIP_SUBTREESKIP_SIBLINGS则不会访问目录中的条目(以及任何后代)。

        参数
        dir - 对目录的引用
        attrs - 目录的基本属性
        结果
        访问结果
        异常
        IOException - 如果发生I / O错误
      • visitFileFailed

        FileVisitResult visitFileFailed​(T file,
                                        IOException exc)
                                 throws IOException
        为无法访问的文件调用。 如果无法读取文件的属性,文件是无法打开的目录以及其他原因,则调用此方法。
        参数
        file - 对文件的引用
        exc - 阻止访问文件的I / O异常
        结果
        访问结果
        异常
        IOException - 如果发生I / O错误
      • postVisitDirectory

        FileVisitResult postVisitDirectory​(T dir,
                                           IOException exc)
                                    throws IOException
        在目录中的条目及其所有后代访问后,为目录调用。 当目录的迭代过早完成时(通过visitFile方法返回SKIP_SIBLINGS ,或者在迭代目录时发生I / O错误),也会调用此方法。
        参数
        dir - 对目录的引用
        exc - null如果目录的迭代完成且没有错误; 否则导致目录迭代过早完成的I / O异常
        结果
        访问结果
        异常
        IOException - 如果发生I / O错误