-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Closed
Description
Hi everyone,
I think there is a file handle leak in the RecursiveDirectoryScanner class in the current version (5.0.5.RELEASE).
I experienced Exceptions with "too many open files" in the RecursiveDirectoryScanner and followed it down to the following code in the listFiles(File) method:
try {
Stream<File> fileStream = Files.walk(directory.toPath(), this.maxDepth, this.fileVisitOptions)
.skip(1)
.map(Path::toFile)
.filter(file -> !supportAcceptFilter
|| ((AbstractFileListFilter<File>) filter).accept(file));
if (supportAcceptFilter) {
return fileStream.collect(Collectors.toList());
}
else {
return filter.filterFiles(fileStream.toArray(File[]::new));
}
} catch (IOException e) {
throw new IllegalArgumentException(e);
}
According to this Stackoverflow thread and my own experiences you have to close the Stream returned by Files.walk.
So the code should be changed to something like this in my opinion:
try (Stream<File> fileStream = Files.walk(directory.toPath(), this.maxDepth, this.fileVisitOptions).skip(1)
.map(Path::toFile)
.filter(file -> !supportAcceptFilter || ((AbstractFileListFilter<File>) filter).accept(file));) {
if (supportAcceptFilter) {
return fileStream.collect(Collectors.toList());
}
return filter.filterFiles(fileStream.toArray(File[]::new));
} catch (IOException e) {
throw new IllegalArgumentException(e);
}
I created my own RecursiveDirectoryScanner with this fix and unless now I couldn't reproduce the Exceptions again.
artembilan
Metadata
Metadata
Assignees
Labels
No labels