2016-12-08 2 views
2

Как реализовать алгоритм в Java 8, учитывая начальный каталог и имя файла, которое ищет файл в данном каталоге или в любых подкаталогах, которые являются вложенные не глубже 5 уровней.Найти файл в каталоге и подкаталогах с помощью Java 8

Для примера рассмотрим следующую структуру каталогов:

Folder 1 
    Folder 2 
     Folder 3 
     Folder 4 
      Folder 5 
       Folder 6 
        nfiles.txt.... 
       MyFile.txt 
       xfile.txt 
      filesInFolder4.... 
     filesInFolder3... 
    ..... 

Алгоритм должен искать файл до файлов containd в папке 5 и сообщить, существует ли файл с указанным именем?

Как это сделать с использованием Java 8?

+2

Показать, что вы пробовали. – Holger

+0

@Holger Я пытаюсь использовать пакет файлов Java NIO и еще не нашел решения. – KayV

+2

Обратите внимание на параметр 'maxDepth' в [' Files.walkFileTree (параметры Путь, Установить , int maxDepth, FileVisitor visitor) '] (https://docs.oracle.com/javase/8 /docs/api/java/nio/file/Files.html#walkFileTree-java.nio.file.Path-java.util.Set-int-java.nio.file.FileVisitor-). Без фактического описания проблемы, описывающего, что происходит при попытке использовать этот метод (или любой из альтернатив), невозможно сказать, как это решить. – Holger

ответ

6

Пожалуйста, взгляните на метод Files.find.

try (Stream<Path> stream = Files.find(Paths.get("Folder 1"), 5, 
      (path, attr) -> path.getFileName().toString().equals("Myfile.txt"))) { 
     System.out.println(stream.findAny().isPresent()); 
} catch (IOException e) { 
     e.printStackTrace(); 
} 
+0

Это вернет либо true, либо false. Я хочу точное расположение файла. – KayV

+1

@KaranVerma 'stream.forEach (System.out :: println);' он даст вам полный путь к файлу –

1

Я нахожу решение работать с files.Find и Files.walk следующим образом:

// Finding a file upto x level in File Directory using NIO Files.find 
    Path start = Paths.get("/Users/***/Documents/server_pull"); 
    int maxDepth = 5; 
    try(Stream<Path> stream = Files.find(start, 
             maxDepth, 
             (path, attr) -> String.valueOf(path).endsWith(".json"))){ 
     String fileName = stream 
          .sorted() 
          .map(String::valueOf) 
          .filter((path) -> { 
           //System.out.println("In Filter : "+path); 
           return String.valueOf(path).endsWith("system_health_12_55_TestServer.json"); 
          }) 
          .collect(Collectors.joining()); 
     System.out.println("fileName : "+fileName); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 

// Finding a file upto x level in File Directory using NIO Files.walk 

    Path startWalk = Paths.get("/Users/***/Documents/server_pull"); 
    int depth = 5; 
    try(Stream<Path> stream1 = Files.walk(startWalk, 
              depth)){ 
     String walkedFile = stream1 
          .map(String::valueOf) 
          .filter(path -> { 
           return String.valueOf(path).endsWith("system_health_12_55_TestServer.json"); 
          }) 
          .sorted() 
          .collect(Collectors.joining()); 
     System.out.println("walkedFile = "+walkedFile); 

    }catch(Exception e){ 
     e.printStackTrace(); 
    } 

кажется более проще, чем walkFileTree ...

+1

Вам не нужен второй 'filter', просто используйте' String.valueOf (path) .endsWith ("system_health_12_55_TestServer.json") 'в методе' find'. –

+0

Чтобы получить вывод следующим образом: имя_файл: /Users/bng/Documents/server_pull/system_health_12_9_TestServer_India_172_20_12_2.json walkedFile = /Users/bng/Documents/server_pull/system_health_12_9_TestServer_India_172_20_12_2.json, я использовал двойную фильтрацию. – KayV

Смежные вопросы