A directory stream visits the entries inside a directory without reading file contents.

directory stream A DirectoryStream opens a lightweight view of the names inside one directory.
try-with-resources The stream is closed automatically when the try block finishes.

Directory List

extra
DirectoryList.java
Replay: real traced execution (multi-file project)
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;

public class DirectoryList {
    public static void main(String[] args) throws Exception {
        int extra = 0;
        Path dir = Files.createTempDirectory("java21");
        Files.writeString(dir.resolve("a.txt"), "A");
        Files.writeString(dir.resolve("b.txt"), "B");

        if (extra > 0) {
            Files.writeString(dir.resolve("c.txt"), "C");
        }

        int count = 0;
        try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) {
            for (Path entry : stream) {
                count++;
            }
        }

        Files.deleteIfExists(dir.resolve("a.txt"));
        Files.deleteIfExists(dir.resolve("b.txt"));
        Files.deleteIfExists(dir.resolve("c.txt"));
        Files.deleteIfExists(dir);
        System.out.println("files=" + count);
    }
}
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;

public class DirectoryList {
    public static void main(String[] args) throws Exception {
        int extra = 1;
        Path dir = Files.createTempDirectory("java21");
        Files.writeString(dir.resolve("a.txt"), "A");
        Files.writeString(dir.resolve("b.txt"), "B");

        if (extra > 0) {
            Files.writeString(dir.resolve("c.txt"), "C");
        }

        int count = 0;
        try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) {
            for (Path entry : stream) {
                count++;
            }
        }

        Files.deleteIfExists(dir.resolve("a.txt"));
        Files.deleteIfExists(dir.resolve("b.txt"));
        Files.deleteIfExists(dir.resolve("c.txt"));
        Files.deleteIfExists(dir);
        System.out.println("files=" + count);
    }
}
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;

public class DirectoryList {
    public static void main(String[] args) throws Exception {
        int extra = 2;
        Path dir = Files.createTempDirectory("java21");
        Files.writeString(dir.resolve("a.txt"), "A");
        Files.writeString(dir.resolve("b.txt"), "B");

        if (extra > 0) {
            Files.writeString(dir.resolve("c.txt"), "C");
        }

        int count = 0;
        try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) {
            for (Path entry : stream) {
                count++;
            }
        }

        Files.deleteIfExists(dir.resolve("a.txt"));
        Files.deleteIfExists(dir.resolve("b.txt"));
        Files.deleteIfExists(dir.resolve("c.txt"));
        Files.deleteIfExists(dir);
        System.out.println("files=" + count);
    }
}
  1. extra ← 0, dir ← /tmp/⟨tmp A⟩, count ← 0

    5public class DirectoryList {6    public static void main(String[] args) throws Exception {7        int extra→ 0 = 0;  //@extra=1, 28        Path dir→ /tmp/⟨tmp A⟩ = Files.createTempDirectory("java21");9        Files.writeString(dir.resolve("a.txt"), "A");10        Files.writeString(dir.resolve("b.txt"), "B");1112        if (extra > 0) {13            Files.writeString(dir.resolve("c.txt"), "C");14        }1516        int count→ 0 = 0;17        try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) {
  2. try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir))

    16int count = 0;17try (DirectoryStream<Path> stream⟨UnixSecureDirectoryStream B⟩ = Files.newDirectoryStream(dir/tmp/⟨tmp A⟩)) {18    for (Path entry : stream) {
  3. count ← 1

    pass 1 of 2
    17try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) {18    for (Path entry/tmp/⟨tmp A⟩/a.txt : stream⟨UnixSecureDirectoryStream B⟩) {19        count→ 1++;20    }
  4. count ← 2

    pass 2 of 2
    17try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) {18    for (Path entry/tmp/⟨tmp A⟩/b.txt : stream⟨UnixSecureDirectoryStream B⟩) {19        count→ 2++;20    }
  5. Files.deleteIfExists(dir);

    23    Files.deleteIfExists(dir.resolve("a.txt"));24    Files.deleteIfExists(dir.resolve("b.txt"));25    Files.deleteIfExists(dir.resolve("c.txt"));26    Files.deleteIfExists(dir/tmp/⟨tmp A⟩);27    System.out.println("files=" + count2);28}
    outputfiles=2
  1. extra ← 1, dir ← /tmp/⟨tmp A⟩

    5public class DirectoryList {6    public static void main(String[] args) throws Exception {7        int extra→ 1 = 1;8        Path dir→ /tmp/⟨tmp A⟩ = Files.createTempDirectory("java21");9        Files.writeString(dir.resolve("a.txt"), "A");10        Files.writeString(dir.resolve("b.txt"), "B");
  2. if (extra > 0)

    12if (extra1 > 0) {13    Files.writeString(dir.resolve("c.txt"), "C");14}
  3. count ← 0

    16int count→ 0 = 0;17try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) {
  4. try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir))

    16int count = 0;17try (DirectoryStream<Path> stream⟨UnixSecureDirectoryStream B⟩ = Files.newDirectoryStream(dir/tmp/⟨tmp A⟩)) {18    for (Path entry : stream) {
  5. count ← 1

    pass 1 of 3
    17try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) {18    for (Path entry/tmp/⟨tmp A⟩/a.txt : stream⟨UnixSecureDirectoryStream B⟩) {19        count→ 1++;20    }
    All 3 passes — pass 1 is the card above
    passentrycount
    1/tmp/⟨tmp A⟩/a.txt0 1
    2/tmp/⟨tmp A⟩/b.txt1 2
    3/tmp/⟨tmp A⟩/c.txt2 3
  6. Files.deleteIfExists(dir);

    23    Files.deleteIfExists(dir.resolve("a.txt"));24    Files.deleteIfExists(dir.resolve("b.txt"));25    Files.deleteIfExists(dir.resolve("c.txt"));26    Files.deleteIfExists(dir/tmp/⟨tmp A⟩);27    System.out.println("files=" + count3);28}
    outputfiles=3
  1. extra ← 2, dir ← /tmp/⟨tmp A⟩

    5public class DirectoryList {6    public static void main(String[] args) throws Exception {7        int extra→ 2 = 2;8        Path dir→ /tmp/⟨tmp A⟩ = Files.createTempDirectory("java21");9        Files.writeString(dir.resolve("a.txt"), "A");10        Files.writeString(dir.resolve("b.txt"), "B");
  2. if (extra > 0)

    12if (extra2 > 0) {13    Files.writeString(dir.resolve("c.txt"), "C");14}
  3. count ← 0

    16int count→ 0 = 0;17try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) {
  4. try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir))

    16int count = 0;17try (DirectoryStream<Path> stream⟨UnixSecureDirectoryStream B⟩ = Files.newDirectoryStream(dir/tmp/⟨tmp A⟩)) {18    for (Path entry : stream) {
  5. count ← 1

    pass 1 of 3
    17try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) {18    for (Path entry/tmp/⟨tmp A⟩/a.txt : stream⟨UnixSecureDirectoryStream B⟩) {19        count→ 1++;20    }
    All 3 passes — pass 1 is the card above
    passentrycount
    1/tmp/⟨tmp A⟩/a.txt0 1
    2/tmp/⟨tmp A⟩/b.txt1 2
    3/tmp/⟨tmp A⟩/c.txt2 3
  6. Files.deleteIfExists(dir);

    23    Files.deleteIfExists(dir.resolve("a.txt"));24    Files.deleteIfExists(dir.resolve("b.txt"));25    Files.deleteIfExists(dir.resolve("c.txt"));26    Files.deleteIfExists(dir/tmp/⟨tmp A⟩);27    System.out.println("files=" + count3);28}
    outputfiles=3