Files and Paths
Directory List
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
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);
}
}
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)) {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) {count ← 1
pass 1 of 217try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) {18 for (Path entry/tmp/⟨tmp A⟩/a.txt : stream⟨UnixSecureDirectoryStream B⟩) {19 count→ 1++;20 }count ← 2
pass 2 of 217try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) {18 for (Path entry/tmp/⟨tmp A⟩/b.txt : stream⟨UnixSecureDirectoryStream B⟩) {19 count→ 2++;20 }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
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");if (extra > 0)
12if (extra1 > 0) {13 Files.writeString(dir.resolve("c.txt"), "C");14}count ← 0
16int count→ 0 = 0;17try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) {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) {count ← 1
pass 1 of 317try (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 pass entrycount1 /tmp/⟨tmp A⟩/a.txt 0 → 1 2 /tmp/⟨tmp A⟩/b.txt 1 → 2 3 /tmp/⟨tmp A⟩/c.txt 2 → 3 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
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");if (extra > 0)
12if (extra2 > 0) {13 Files.writeString(dir.resolve("c.txt"), "C");14}count ← 0
16int count→ 0 = 0;17try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) {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) {count ← 1
pass 1 of 317try (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 pass entrycount1 /tmp/⟨tmp A⟩/a.txt 0 → 1 2 /tmp/⟨tmp A⟩/b.txt 1 → 2 3 /tmp/⟨tmp A⟩/c.txt 2 → 3 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