Если вы просто хотите запустить Files.list
асинхронно из вызывающего потока, вы можете сделать это без поиска «альтернативных» файловых API.
Самым базовым примером будет:
Runnable lister = () -> {
try {
SomeReceivingClassOrInstance
.someEventMethod(Files.list(Path.of("yourPath")));
}
catch (IOException ioe) {
// TODO handle
ioe.printStackTrace();
}
};
. Затем вы можете:
- реализовать метод, принимающий a
Stream<Path>
на стороне получателя, идействуя на. - Вызовите
Runnable
асинхронно с new Thread(lister).start();
, с которого вы хотите начать операцию асинхронно
Обратите внимание, что существует множество альтернативных и более элегантных примеров более высокого уровня, чтобывыполнять операции асинхронно.
Это просто пример, демонстрирующий, что не нужно действительно нужно смотреть дальше в API nio (например, с FileVisitor
и т. Д.), Чтобы асинхронизировать это.
Примечание
Включено после размышления: если вместо этого вы действительно хотите, чтобы собрание лениво заполнялось на основе того, что список постепенно «обнаруживает», то вам, вероятно, было бы лучше начатьFileVisitor
в своем собственном потоке и заполнении потокобезопасного сбора для каждой записи.