gpt4 book ai didi

java-7 - Java 7 walkFileTree 在目录上调用visitFile

转载 作者:行者123 更新时间:2023-12-01 15:48:25 25 4
gpt4 key购买 nike

假设我有以下目录结构

/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.:没有 visitFile对于最深的目录,您甚至不会意识到它们在那里。

所以我认为是 常规行为 .

顺便说一句,您可以在覆盖以下内容时使用 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);
}

关于java-7 - Java 7 walkFileTree 在目录上调用visitFile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20676146/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com