対策する資格
Java Silver ・ 近日ORACLE Silver ・ 近日
Gold 保有者 監修1Z0-829 対応
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
  1. A4
  2. B3
  3. C2
  4. Dコンパイルエラー(Files.walkIOException を処理していない)
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AGold監修

解説

Files.walk(start)start を起点に深さ優先でファイルツリーを再帰的に走査する Stream<Path> を返す。重要なのは起点ディレクトリ自身が最初の要素として含まれる点と、深さ制限を付けなければ全階層まで降りる点。

列挙される要素は次の4つ:

  • <dir>(起点ディレクトリ自身)
  • <dir>/a.txt
  • <dir>/sub(サブディレクトリ自身)
  • <dir>/sub/b.txt

よって count()4。(列挙順は保証されないが、件数は決定的。)

mainthrows IOException を宣言しているのでコンパイルは通る(Files.walkcreateFile 等は検査例外 IOException を投げる)。

各誤答が違う理由
  • B起点ディレクトリ自身を数え忘れる典型ミス。walk は起点を含む。
  • Csub 配下に降りない(浅い列挙)と誤解。walk は既定で全階層を再帰する(深さ制限は Files.walk(dir, maxDepth) で指定)。
  • Dmainthrows IOException 済みなので検査例外は処理されており、コンパイルエラーにならない。
ひっかけ: ①「中身の数」と思って起点ディレクトリを数え落とす(実際は起点も1件)。②サブディレクトリ自体も1件として数える。③ Files.walk が返す Streamclose すべきリソース(本問では件数には影響しないが、実務では try-with-resources 推奨)。
実機確認の答え合わせ
出力:
4
公式ドキュメント・関連Files.walk(Path, FileVisitOption...)
Gold 保有者による書き下ろし解説・実機で検証済
この分野をもっと解いて、得点源に
NIO.2 を含む全問を分野別に演習できます(無料)。
演習する →