Проверьте, существует ли файл где-нибудь в системе ...? - PullRequest
0 голосов
/ 28 июня 2018

Если я нахожусь в каталоге глубоко внутри файловой структуры, как я могу проверить, существует ли файл где-нибудь в файловом дереве (как в любом месте системы)? Я пытаюсь использовать файл существующие (), но он не работает.

Пример: Если корневой каталог имеет четыре подкаталога: a, b, c и d. И в директории есть файл .txt. Если у dir d есть три sub dir, и я в данный момент нахожусь в самом дальнем sub dir. Если я делаю что-то вроде (новый файл ("a.txt")). Exist (), он говорит, что файл не существует. Поэтому я хочу знать, как найти, существует ли файл в суперкаталоге, который может находиться где угодно в системе.

Редактировать: Например, если я не знаю каталог, в котором находится файл, и просто имя файла, как вы узнаете, существует ли он?

Я новичок в Java, поэтому любая помощь будет оценена.

1 Ответ

0 голосов
/ 28 июня 2018

Вы можете использовать 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
}

...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...