如果我位于文件结构内的较深目录中,如何检查文件是否位于文件树上方(例如系统上的任何位置)?我正在尝试使用exist()文件,但似乎无法正常工作。
Ex:如果根目录具有四个子目录:a,b,c和d。 dir a具有文件a.txt。如果dir d具有三个sub dirs,而我当前位于最远的sub dir中。如果我执行(new File(“ a.txt”))。exists()之类的操作,则表明该文件不存在。因此,我想知道如何查找超级目录中是否存在文件,该目录可以在系统上的任何位置。
编辑:例如,如果我不知道文件所在的目录,而只知道文件名,那么如何查看它是否存在?
我是Java的新手,所以将不胜感激。
答案 0 :(得分:1)
您可以将java.nio
类与Java 8的stream
结合使用。 Files
类包含一个walk
方法,该方法将遍历文件和目录。
Path root = Paths.get("/path/to/root");
boolean result = Files.walk(root)
.filter(Files::isRegularFile)
.anyMatch(p -> p.endsWith("a.txt"));
请注意,endsWith
与完整文件名匹配,如果文件名为bla.txt
,则不会匹配。
如果您需要查找文件,则可以执行以下操作:
Optional<Path> result = Files.walk(root)
.filter(Files::isRegularFile)
.filter(p -> p.endsWith("a.txt"))
.findAny();
if (result.isPresent()) {
// do something with the file
} else {
// whoopsie, not found
}
如果要查找多个文件,可以执行以下操作:
List<Path> result = Files.walk(root)
.filter(Files::isRegularFile)
.filter(p -> p.endsWith("a.txt"))
.collect(Collectors.toList());
if (!result.isEmpty()) {
... do smth with the paths
} else {
... whoopsie, not found
}
如果需要,您也可以直接处理找到的文件:
Files.walk(root)
.filter(Files::isRegularFile)
.filter(p -> p.endsWith("a.txt"))
.forEach(this::process);
private void process(Path path) {
// do smth with the path
}
...