Hallo zusammen,
ich würde gerne ein Verzeichnis rekursiv durchlaufen und dabei die auftretenden Exceptions behandeln, ohne den Lauf abzubrechen. Wichtig ist, dass sowohl Verzeichnisse (leere), als auch Dateien aufgelistet werden, und das ganze möglichst mit dem Rückgabetyp Stream<Path>, damit ich bisherigen Code weiter verwenden kann.
Folgenden Ansatz habe ich versucht (hier fehlen Verzeichnisse):
Files.find oder Files.walk brechen bei einer Exception ab
Weiß jemand Rat?
ich würde gerne ein Verzeichnis rekursiv durchlaufen und dabei die auftretenden Exceptions behandeln, ohne den Lauf abzubrechen. Wichtig ist, dass sowohl Verzeichnisse (leere), als auch Dateien aufgelistet werden, und das ganze möglichst mit dem Rückgabetyp Stream<Path>, damit ich bisherigen Code weiter verwenden kann.
Folgenden Ansatz habe ich versucht (hier fehlen Verzeichnisse):
Java:
static class FN<T extends Path> implements Function<T, Stream<T>> {
@Override
public Stream<T> apply(T p) {
if (!Files.isDirectory(p, LinkOption.NOFOLLOW_LINKS)) {
return Stream.of(p);
} else {
try {
return toStream(Files.newDirectoryStream(p)).flatMap(q -> apply((T) q));
} catch (IOException ex) {
return Stream.empty();
}
}
}
}
public static void main(String[] args) throws IOException {
Path path = Paths.get("some path");
long count = toStream(Files.newDirectoryStream(path))
.parallel()
.flatMap(new FN<>()::apply)
.count();
System.out.println("count: " + count);
}
static <T> Stream<T> toStream(Iterable<T> iterable) {
return StreamSupport.stream(iterable.spliterator(), false);
}
Files.find oder Files.walk brechen bei einer Exception ab
Code:
Stream<Path> stream = Files.find(start, maxDepth, (path, attr) ->
String.valueOf(path).endsWith(".js"));
Weiß jemand Rat?