我运行这段代码是为了遍历一个目录-
import java.io.*;
import java.nio.file.*;
import java.nio.file.attribute.*;
public class FindDirectoriesTest {
public void find()
throws IOException
{
Path dir = Paths.get("some_dir");
Files.walkFileTree(dir, new SimpleFileVisitor<Path>() {
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
throws IOException
{
if (attrs.isDirectory()) {
//do something;
} else {
//do something else
}
return FileVisitResult.CONTINUE;
}
public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException
{
return FileVisitResult.CONTINUE;
}
});
}
}
问题是即使有目录,attrs.isDirectory()
也不会执行。它正确地列出了所有常规文件,但没有列出目录。这里少了什么吗?
bskaggs是对的。我在研究nio包时也遇到了同样的问题。然后找到了这个页面。想知道为什么这个问题多年前就被问到了,却没有得到回答或结束。以下是用于打印所给路径的子目录列表的代码。
import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
public class WalkTreeExample {
public static void main(String[] args) throws IOException {
Path p = Paths.get("C:\Users");
Files.walkFileTree(p, new SimpleFileVisitor<Path>()
{
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
if(Files.isDirectory(dir))
System.out.println(dir);
return FileVisitResult.CONTINUE;
}
});
}
}
visitFile
仅在访问文件而非目录时调用。相反,您应该添加另一个覆盖preVisitDirectory
或postVisitDirectory
的函数(取决于您是希望在访问子目录中的所有文件之前还是之后执行操作),并将特定于目录的逻辑放置在那里。