Java DirectoryStream
last modified June 26, 2025
In this article, we demonstrate how to iterate over directories in Java using
the DirectoryStream interface. This approach is efficient and
well-suited for processing directory contents without loading everything into
memory at once.
A DirectoryStream provides a flexible way to traverse the entries
in a directory. It integrates seamlessly with the enhanced
for-loop, allowing developers to iterate over files and
subdirectories in a clean and readable manner.
To obtain a DirectoryStream, use the
Files.newDirectoryStream(Path dir) method. This method opens the
specified directory and returns a stream-like object that can be used to access
each entry one at a time.
DirectoryStream listing home directory
The first example lists the user's home directory.
void main() throws IOException {
var homeDir = Paths.get(System.getProperty("user.home"));
try (var paths = Files.newDirectoryStream(homeDir)) {
paths.forEach(System.out::println);
}
}
The example lists contents of the user's home directory.
DirectoryStream globbing example
We can apply simple globbing operation on a stream of content.
The second parameter of the Files.newDirectoryStream is
the glob pattern.
void main() throws IOException {
var dirName = Paths.get("C:/Users/Jano/Downloads");
try (var paths = Files.newDirectoryStream(dirName, "*.pdf")) {
paths.forEach(System.out::println);
}
}
The example shows all PDF files in the specified directory.
DirectoryStream filter example
More complex filtering operations can be applied with
DirectoryStream.Filter.
void main() throws IOException {
DirectoryStream.Filter<Path> filter = file ->
Files.size(file) < 100_000L && file.toString().endsWith(".jpg");
var dirName = Paths.get("C:/Users/Jano/Downloads");
try (var paths = Files.newDirectoryStream(dirName, filter)) {
paths.forEach(System.out::println);
}
}
The example shows all JPEG images that are smaller than 100 KB.
DirectoryStream recursive walking
In the following example, we show how to traverse recursively a directory
with DirectoryStream.
List<Path> paths = new ArrayList<>();
List<Path> walk(Path path) throws IOException {
try (DirectoryStream<Path> stream = Files.newDirectoryStream(path)) {
for (Path entry : stream) {
if (Files.isDirectory(entry)) {
walk(entry);
}
paths.add(entry);
}
}
return paths;
}
void main() throws IOException {
var myPath = Paths.get("C:/Users/Jano/Downloads");
var paths = walk(myPath);
paths.forEach(System.out::println);
}
The example walks over the directory recursively. It collects all
the entries in a list and prints them out. The walk method
takes a Path object as an argument and returns a list of
Path objects representing the entries in the directory and its
subdirectories.
Source
Java DirectoryStream - language reference
In this article we have used Files.newDirectoryStream to list
the directory contents.
Author
List all Java tutorials.