Details
Description
When i use FileUtils.iterateFiles and i decide to not iterate on all results, something is not closed correctly.
This code create "Too Many Open files":
import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.util.Iterator; import org.apache.commons.io.FileUtils;public class FileUtilsTest { static long step=0; public static void main(String[] argv) throws IOException { /* * create test directory */ File tmpDirectory = Files.createTempDirectory("pipo").toFile(); try { /* * add one file */ new File(tmpDirectory, "first").createNewFile(); /* * try until TooManyOpenFiles Exception */ while(true) { /* * Iterate only to find first entry */ Iterator<File> candidates = FileUtils.iterateFiles(tmpDirectory, null, false); if (!candidates.hasNext()) { throw new RuntimeException("one file must exists"); } System.out.print("\rend step:"+(++step)); } } finally { FileUtils.deleteDirectory(tmpDirectory); } }}
Exception trace:
java -cp Bug-all.jar FileUtilsTest
end step:2044
Exception in thread "main" java.io.UncheckedIOException: /tmp/pipo4192501847009771344
at org.apache.commons.io.FileUtils.iterateFiles(FileUtils.java:1927)
at FileUtilsTest.main(FileUtilsTest.java:28)
Caused by: java.nio.file.FileSystemException: /tmp/pipo4192501847009771344: Too many open files
at java.base/sun.nio.fs.UnixException.translateToIOException(UnixException.java:100)
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111)
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:116)
at java.base/sun.nio.fs.UnixFileSystemProvider.newDirectoryStream(UnixFileSystemProvider.java:432)
at java.base/java.nio.file.Files.newDirectoryStream(Files.java:472)
at java.base/java.nio.file.FileTreeWalker.visit(FileTreeWalker.java:300)
at java.base/java.nio.file.FileTreeWalker.walk(FileTreeWalker.java:322)
at java.base/java.nio.file.FileTreeIterator.<init>(FileTreeIterator.java:71)
at java.base/java.nio.file.Files.walk(Files.java:3825)
at org.apache.commons.io.file.PathUtils.walk(PathUtils.java:1044)
at org.apache.commons.io.FileUtils.streamFiles(FileUtils.java:2971)
at org.apache.commons.io.FileUtils.iterateFiles(FileUtils.java:1925)
... 1 more