Module java.base
Package java.nio.file

Interface 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 {
                // 目录迭代失败
                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;
            }
        });
自 JDK 版本:
1.7
  • Method Details

    • preVisitDirectory

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

      如果此方法返回CONTINUE,则将访问目录中的条目。如果此方法返回SKIP_SUBTREESKIP_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 错误