I need to get a list of all the files in a directory, including files in all the sub-directories. What is the standard way to accomplish directory iteration with Java?
Advertisement
Answer
You can use File#isDirectory()
to test if the given file (path) is a directory. If this is true
, then you just call the same method again with its File#listFiles()
outcome. This is called recursion.
Here’s a basic kickoff example:
package com.stackoverflow.q3154488; import java.io.File; public class Demo { public static void main(String... args) { File dir = new File("/path/to/dir"); showFiles(dir.listFiles()); } public static void showFiles(File[] files) { for (File file : files) { if (file.isDirectory()) { System.out.println("Directory: " + file.getAbsolutePath()); showFiles(file.listFiles()); // Calls same method again. } else { System.out.println("File: " + file.getAbsolutePath()); } } } }
Note that this is sensitive to StackOverflowError
when the tree is deeper than the JVM’s stack can hold. If you’re already on Java 8 or newer, then you’d better use Files#walk()
instead which utilizes tail recursion:
package com.stackoverflow.q3154488; import java.io.File; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; public class DemoWithJava8 { public static void main(String... args) throws Exception { Path dir = Paths.get("/path/to/dir"); Files.walk(dir).forEach(path -> showFile(path.toFile())); } public static void showFile(File file) { if (file.isDirectory()) { System.out.println("Directory: " + file.getAbsolutePath()); } else { System.out.println("File: " + file.getAbsolutePath()); } } }