java - Java Files.walk遇到异常错误后能否继续执行

标签 java java-io

这是我第一次在 Java 中使用 Files.walk,我很喜欢它,尤其是 Path 类。它功能强大且用途广泛。

然而,我不喜欢的是,在遍历文件夹时,如果迭代器遇到障碍......就像它遇到了用户无权查看的文件夹或可能遇到的任何错误,在它抛出异常之后,它不会继续,也不会产生一个可以使用的路径列表。

这是我如何使用该方法的示例:

try {
    Stream<Path> paths    = Files.walk(rootPath);
    List<Path>   pathList = paths.collect(Collectors.toList());
    for (Path path : pathList) {
        //Processing code here
    }
 }
catch (FileSystemException a) {System.err.format("FileSystemException: %s%n", a);System.out.println(a.getStackTrace());}
catch (UncheckedIOException b) {System.err.format("UncheckedIOException: %s%n", b);System.out.println(b.getCause().getLocalizedMessage());}
catch (IOException c) { System.err.format("IOException: %s%n", c);System.out.println(c.getStackTrace());}

现在,如果 Files.walk 方法在尝试遍历文件夹时遇到某种错误,它会抛出异常,然后代码当然会在捕获异常后继续运行。

我想要它做的是忽略它遇到的任何问题,并继续迭代它可以不停止的任何文件夹。

这可能吗?

最佳答案

您可以使用 Files#walkFileTree() 方法并实现您自己的访问者对象,该对象将忽略异常:

public class Test
{
    public static void main(String[] args) throws Exception
    {
        
        Path rootPath = Path.of("e:\\walkMe");
        Files.walkFileTree(rootPath,new MyVisitor());
    
    }
}
class MyVisitor implements FileVisitor<Path> {

    @Override
    public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) {
        System.out.println(dir);
        return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
        System.out.println(file);
        return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult visitFileFailed(Path file, IOException exc) {
        
        System.out.println("error on: " + file + " " + exc.getClass());
        return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult postVisitDirectory(Path dir, IOException exc) {    
        return FileVisitResult.CONTINUE;
    }
}

输出:

e:\walkMe
e:\walkMe\ab
e:\walkMe\ab\ab.txt
error on: e:\walkMe\cd class java.nio.file.AccessDeniedException
e:\walkMe\ef
e:\walkMe\ef\ef.txt

此处应用程序无法浏览文件夹 cd,但它会继续遍历其余文件夹和文件。

关于java - Java Files.walk遇到异常错误后能否继续执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66996449/

相关文章:

java - 删除临时文件onexit java vm

java - java中读取到文件末尾

Java Date 对象解析精度在 SimpleDateFormat 上关闭

javascript - 如何通过Java解析器现场触发jQuery脚本

java - core-0.13.0.job.jar 丢失,我需要它

javascript - 获取jsp中css或js的最后修改日期

java - 在文件中写入和读取混合数据

java - 无法抗拒工作

java - 如何创建一个在用户登录后启动的桌面应用程序?

MysqlDataSource 的 Java EE ClassNotFoundException。我究竟做错了什么?