Module  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
        在目录中的条目之后调用目录,并且已经访问了所有的后代。 当该目录的迭代过早完成(通过返回SKIP_SIBLINGSvisitFile方法或者在遍历目录时发生I / O错误),也会调用此方法。
        参数
        dir - 对目录的引用
        exc - null如果目录的迭代完成没有错误; 否则会导致目录的迭代过早完成的I / O异常
        结果
        访问结果
        异常
        IOException - 如果发生I / O错误