Вы можете использовать Path.list для этого, он вернет вам поток, который оценивается лениво:
List<String> fileNames = Path.list("path_to_directory")
.map(Path::getFileName)
.collect(Collectors.toList());
Файлы будут обработаны один за другим, и это будетпотреблять меньше памяти.Однако у вас все еще могут возникнуть проблемы с памятью, если окончательный список fileNames
станет слишком большим.Таким образом, операция терминала (сбора) в поточном конвейере может вызвать некоторые проблемы.
Но, например, если вы обрабатываете имя файла непосредственно в потоке (используя forEach, например, не собирая их), вы можете избежать загрузки всех имен в память.
Path.list("path_to_directory")
.map(Path::getFileName)
.forEach(System.out::println);
// printфайлы по одному, не загружая их все одновременно.
Надеюсь, это поможет.