检查文件是否存在于系统上的任何地方...?

时间:2018-06-28 20:27:33

标签: java file io

如果我位于文件结构内的较深目录中,如何检查文件是否位于文件树上方(例如系统上的任何位置)?我正在尝试使用exist()文件,但似乎无法正常工作。

Ex:如果根目录具有四个子目录:a,b,c和d。 dir a具有文件a.txt。如果dir d具有三个sub dirs,而我当前位于最远的sub dir中。如果我执行(new File(“ a.txt”))。exists()之类的操作,则表明该文件不存在。因此,我想知道如何查找超级目录中是否存在文件,该目录可以在系统上的任何位置。

编辑:例如,如果我不知道文件所在的目录,而只知道文件名,那么如何查看它是否存在?

我是Java的新手,所以将不胜感激。

1 个答案:

答案 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
}

...