NIO.2(Files.walk)難易度 標準無料
空のディレクトリを新規作成し、その中に下図の構造を作ってから Files.walk で要素数を数える。出力は?
1 import java.nio.file.*;
2 import java.io.IOException;
3 public class Q5 {
4 public static void main(String[] a) throws IOException {
5 Path dir = Files.createTempDirectory("q5");
6 Files.createFile(dir.resolve("a.txt"));
7 Files.createDirectory(dir.resolve("sub"));
8 Files.createFile(dir.resolve("sub/b.txt"));
9 long count = Files.walk(dir).count();
10 System.out.println(count);
11 }
12 }
作られる構造:
<dir>/
├── a.txt
└── sub/
└── b.txt- A
4 - B
3 - C
2 - Dコンパイルエラー(
Files.walkのIOExceptionを処理していない)
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:A✓Gold監修
解説
Files.walk(start) は start を起点に深さ優先でファイルツリーを再帰的に走査する Stream<Path> を返す。重要なのは起点ディレクトリ自身が最初の要素として含まれる点と、深さ制限を付けなければ全階層まで降りる点。
列挙される要素は次の4つ:
<dir>(起点ディレクトリ自身)<dir>/a.txt<dir>/sub(サブディレクトリ自身)<dir>/sub/b.txt
よって count() は 4。(列挙順は保証されないが、件数は決定的。)
main が throws IOException を宣言しているのでコンパイルは通る(Files.walk・createFile 等は検査例外 IOException を投げる)。
- B起点ディレクトリ自身を数え忘れる典型ミス。
walkは起点を含む。 - C
sub配下に降りない(浅い列挙)と誤解。walkは既定で全階層を再帰する(深さ制限はFiles.walk(dir, maxDepth)で指定)。 - D
mainがthrows IOException済みなので検査例外は処理されており、コンパイルエラーにならない。
ひっかけ: ①「中身の数」と思って起点ディレクトリを数え落とす(実際は起点も1件)。②サブディレクトリ自体も1件として数える。③
Files.walk が返す Stream は close すべきリソース(本問では件数には影響しないが、実務では try-with-resources 推奨)。実機確認の答え合わせ
出力: 4
公式ドキュメント・関連Files.walk(Path, FileVisitOption...)↗
✓Gold 保有者による書き下ろし解説・実機で検証済