Java 7 walkFileTree在目录上调用visitFile

马修·麦森(Matthew Madson)

说我有以下目录结构

/root/dir
/root/dir/file1.txt
/root/dir/subdir
/root/dir/subdir/file2.txt

假设我将使用以下访客:

class MyFileVisitor extends SimpleFileVisitor<Path> {

  @Override
  public FileVisitResult visitFile(final Path file, final BasicFileAttributes attrs)
  throws IOException {
    if(Files.isDirectory(file)) {
      throw new IllegalStateException("WAT!? Visiting directory: "+file.toAbsolutePath().toString());
    }
    System.out.println("Visiting file: "+file.toAbsolutePath().toString());
    return super.visitFile(file, attrs);
  }

如果我们使用walkFileTree的简单重载:

Files.walkFileTree(Paths.get("/root/dir"), new MyFileVisitor());  

一切都按计划进行,我们看到以下输出:

Visiting file: /root/dir/file1.txt
Visiting file: /root/dir/subdir/file2.txt

但是,当我们尝试设置最大深度时,事情开始崩溃:

Files.walkFileTree(Paths.get("/root/dir"), EnumSet.noneOf(FileVisitOption.class), 1, new MyFileVisitor());

输出:

Visiting file: /root/dir/file1.txt

java.lang.IllegalStateException: WAT!? Visting directory: /root/dir/subdir

我很确定这是一个错误,但是我想先问一下社区:我缺少什么了吗,这实际上是预期的行为吗?感谢您的确认!

细节:

java -version
java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)
弗朗兹·埃伯纳

我用了一些代码,并增加了几行:

/*
 * (non-Javadoc)
 * 
 * @see java.nio.file.SimpleFileVisitor#preVisitDirectory(java.lang.Object,
 * java.nio.file.attribute.BasicFileAttributes)
 */
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs)
        throws IOException {
    System.out.println(Thread.currentThread().getStackTrace()[1] + " "
            + dir);
    return super.preVisitDirectory(dir, attrs);
}

/*
 * (non-Javadoc)
 * 
 * @see java.nio.file.SimpleFileVisitor#postVisitDirectory(java.lang.Object,
 * java.io.IOException)
 */
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc)
        throws IOException {
    System.out.println(Thread.currentThread().getStackTrace()[1] + " "
            + dir);
    return super.postVisitDirectory(dir, exc);
}

/*
 * (non-Javadoc)
 * 
 * @see java.nio.file.SimpleFileVisitor#visitFileFailed(java.lang.Object,
 * java.io.IOException)
 */
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc)
        throws IOException {
    System.out.println(Thread.currentThread().getStackTrace()[1] + " "
            + file);
    return super.visitFileFailed(file, exc);
}

不用担心,看看发生了什么。

您所说的错误发生在这里java.nio.file.FileTreeWalker:134

    // at maximum depth or file is not a directory
    if (depth >= maxDepth || !attrs.isDirectory()) {
        return visitor.visitFile(file, attrs);
    }

最后,我对此有何看法:

1 .: subdir是深度1的一部分
2 ::如果没有visitFilefor最深的目录,您甚至不会意识到它们在那里。

所以我认为这是正常行为

顺便说一句,您可以在覆盖以下内容时使用attrs:

@Override
public FileVisitResult visitFile(final Path file,
        final BasicFileAttributes attrs) throws IOException {
    if (attrs.isDirectory()) {
        throw new IllegalStateException("WAT!? Visiting directory: "
                + file.toAbsolutePath().toString());
    }
    System.out
            .println("Visiting file: " + file.toAbsolutePath().toString());
    return super.visitFile(file, attrs);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

带通配符的Java 7 Nio列表目录

来自分类Dev

从CentOS 7终端调用Java程序

来自分类Dev

Java 7 PathMatcher:**匹配0个目录吗?

来自分类Dev

使用Java 7仅访问特定深度的目录

来自分类Dev

了解Enum类中的Java 7隐式方法调用

来自分类Dev

从 Java 在 Linux 上调用 ps

来自分类Dev

JFileChooser崩溃-Java 7

来自分类Dev

JCE-Java 7 ...?

来自分类Dev

Java 7中的RecurssiveAction

来自分类Dev

Java 7中的Java流

来自分类Dev

Debian 6.0上的Java 7无法运行usr / bin / java没有这样的文件或目录

来自分类Dev

在文本文件而非目录上调用opendir(3)

来自分类Dev

为什么在目录上调用File.listFiles时可以返回null?

来自分类Dev

NSXMLParser解析器:parseErrorOccurred:未在iOS 7上调用

来自分类Dev

自Java 7u51可用以来,LiveConnect调用在7u45上被阻止

来自分类Dev

共享NFS主目录上的无密码SSH无效(centos 7)

来自分类Dev

Apple 7被Java 7中的Java安全设置阻止

来自分类Dev

在Ubuntu 13.10上安装Java 7和Java 7

来自分类Dev

在Ubuntu 13.10上安装Java 7和Java 7

来自分类Dev

Jenkins JAVA_HOME 7看起来不像JDK目录

来自分类Dev

Spring Java Config与Jboss 7

来自分类Dev

Java 7-Mac + Eclipse

来自分类Dev

Eclipse和JAVA EE 7

来自分类Dev

7段OCR Java应用

来自分类Dev

Java 7安装错误

来自分类Dev

无法从Eclipse使用Java 7?

来自分类Dev

Java 7命令使用问题

来自分类Dev

Java 7缩小文件

来自分类Dev

Java 7安装错误