Files.walk似乎没有进入子文件夹Java



我有这个函数,它应该获取文件夹及其子文件夹中所有以.bak结尾的文件,但是当我调试它时,它说它的深度为一个,我想这意味着它确实有子文件夹?但是 nextstage 说 null,它只获取 localPath 中的文件,而不是子文件夹中的文件。

这是代码

  private static List<FileInfo> listBackupFilesInLocalDir(String localPath, Predicate<String> fileNamePredicate) {
    try (Stream<Path> files = Files.walk(Paths.get(localPath))) {
        return files.filter(p -> fileNamePredicate.test(p.getFileName().toString()))
                    .map(p -> new FileInfo(p.getFileName().toString(), p.toFile().length()))
                    .sorted()
                    .collect(toList());
    } catch (IOException e) {
        log.error("Error listing directories", e);
        throw new RuntimeException(e);
    }
}

这是使用谓词等调用上述方法的方法调用

listBackupFilesInLocalDir(localPath, s -> s.endsWith(".bak"));

你的代码看起来是正确的。不确定过滤谓词的作用(因为不包括代码(,但这样的代码应该可以工作(我只是用朴素字符串比较替换了谓词(:

    try (Stream<Path> files = Files.walk(Paths.get(localPath))) {
        return files.filter(p -> p.getFileName().toString().endsWith(".png"))
                    .map(p -> new FileInfo(p.getFileName().toString(), p.toFile().length()))
                    .sorted()
                    .collect(Collectors.toList());
    } catch (IOException e) {
        throw new RuntimeException(e);
    }

请确保:

  1. 您的 FileInfo 类(此处未包含(实现可比较(用于 sorted() (
  2. 筛选谓词正常工作

地图文件行上似乎是谓词问题或异常。

try {
       Files.walk(Paths.get(localPath)).filter(Files::isRegularFile)
       .filter(path -> !Files.isDirectory(path))
       .filter(file ->file.toString().endsWith(".bak"))
       .map(p -> new FileInfo(p.getFileName().toString(), p.toFile().length()))
       .forEach(path -> {
                    System.out.println(path.toString());
       });
    }catch (Exception e) {
        e.printStackTrace();
    }

您可以使用 endsWith 方法直接过滤文件扩展名。

请注意,.sorted(( 会导致 ClassCastException。

如果你想作为列表返回,只需删除每个并添加.collect(Collectors.toList(((;

相关内容

  • 没有找到相关文章

最新更新