模块 java.base

接口 FileVisitor<T>

类型参数:
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_SUBTREE SKIP_SIBLINGS ,则将不会访问目录(以及任何后代)中的条目。

      参数:
      dir - 对目录的引用
      attrs - 目录的基本属性
      返回:
      访问结果
      抛出:
      IOException - 如果发生 I/O 错误
    • visitFile

      FileVisitResult  visitFile(T  file, BasicFileAttributes  attrs) throws IOException
      为目录中的文件调用。
      参数:
      file - 对文件的引用
      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 错误