Конвертировать Files.walk в SimplefileVisitor
Скажи, что у меня есть такая вещь
Stream<Path> files = Files.walk(Paths.get(somePath))
Что я тогда через поток и собирать
но затем я хочу преобразовать его для использования SimpleFileVisitor, потому что это необходимо, как я буду делать? Я гуглил и пытался часами, ничего не получая. Можете ли вы даже использовать Stream с SimpleFileVisitor? или мне нужно повторить метод во всем? Как я понимаю, мне нужно несколько методов, чтобы использовать SimpleFileVisitor, и я чувствую растерянность по этому поводу. Files.walk были очень просты, но это не работает для моих намерений.
1 ответ
Подход SimpleFileVisitor:
Для того, чтобы использовать SimpleFileVisitor вы можете использовать walkFileTree
следующим образом:
try {
Files.walkFileTree(Paths.get("somePath"), new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
System.out.println("visitFile: " + file);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException ex) throws IOException {
System.out.println("visitFileFailed: " + file + " because of " + ex);
return FileVisitResult.CONTINUE;
}
// etc... you can add postVisit...
});
} catch (IOException e) {
...
}
Это позволяет вам выполнять действия при посещении каждого файла, но не имеет ничего общего с потоками (скважинный поток - это инструмент, который вы должны использовать, когда он соответствует вашим потребностям, не заставляйте себя использовать его, когда это не удобно)
Потоковый подход:
Если вы предпочитаете прогулку и стрим, вы можете сделать следующее:
Stream<Path> files = Files.walk(Paths.get("somePath")).forEach(path -> doSomethingWithPath(path));
Не уверен, почему вам нужен SimpleFileVisitor здесь, как ваше объяснение:
потому что это необходимо
довольно таинственно;)