我有这个函数,它应该获取文件夹及其子文件夹中所有以.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);
}
请确保:
- 您的 FileInfo 类(此处未包含(实现可比较(用于
sorted()
( - 筛选谓词正常工作
地图文件行上似乎是谓词问题或异常。
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(((;