2016-05-27 2 views
0

Я ожидаю увидеть список всех файлов, находящихся в папке пути d:/test. Однако я могу получить файлы непосредственно под этой папкой, но не рекурсивно. Код:Files.newDirectoryStream (путь) не возвращает рекурсивно файлы

 String folder = "D:/test"; 
     Path path = fs.getPath(folder); 
     try (DirectoryStream<Path> directoryStream = Files.newDirectoryStream(path)) { 
      for (Path p : directoryStream) { 
       System.out.println(p.getFileName()); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

результат:

a.txt 
folder 

структура папок: enter image description here

+0

вы имели в виду * рекурсивно * вместо * итеративно *? – glee8e

ответ

2

Другой способ этого продлив собственную логику:

public static void printFileNamesRecursively(String path){ 
    Path yourPath = FileSystems.getDefault().getPath(path); 

    try (DirectoryStream<Path> directoryStream = Files.newDirectoryStream(yourPath))   { 
      for (Path p : directoryStream) { 
       System.out.println(p.getFileName()); 
       if(p.toFile().isDirectory()){ 

        printFileNamesRecursively(p.toString()); 
       } 

      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
} 
1

Это правильное поведение для DirectoryStream. Вместо этого вы можете использовать org.apache.commons.io.FileUtils, чтобы перечислить файлы рекурсивно.

3

Files::newDirectoryStream должны вести себя так. Если вы хотите рекурсивно получить все каталоги и файлы в данном каталоге и его подкаталогах, вам понадобятся Files::walk или Files::walkFileTree. Например (я предполагаю, что вы используете Java 8):

Path path = //... 
try { 
    Files.walk(path).map(Path::getFileName).forEach(System.out::println); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
+0

, так что я думаю, что @ Rambler-ответ был бы «как это сделать» в java 7? – Tiina

+1

@ Тиина Конечно. Но будьте осторожны, если ваш каталог очень, очень глубокий или содержит цикл (через символические/жесткие ссылки), вы получите StackOverFlowExcepetion. Если ваше программное обеспечение может работать с неизвестным каталогом, вам может потребоваться изменить его работу. – glee8e