Skip to content
閲覧中:
2. NIO.2:ファイル操作 (51-100)

2. NIO.2:ファイル操作 (51-100)

NIO.2(New I/O 2)は、Java Gold試験において最も複雑な「計算問題(パス操作)」と「APIの仕様」が出る分野です。51番から100番まで、試験に出るポイントを網羅して解説します。


51-65. Pathインターフェースの基本

Pathは文字列としての操作がメインですが、メソッドの結果を予測させる問題が頻出します。

Java
// 51-53. Pathの取得
Path p1 = Path.of("/data/logs/error.log"); // Java 11+
Path p2 = Paths.get("config/settings.xml"); // 従来のPathsクラス

// 57-60. 階層情報の取得(ルートは含まない)
System.out.println(p1.getNameCount()); // 3 (data, logs, error.log)
System.out.println(p1.getName(0));     // data
System.out.println(p1.getFileName());  // error.log

// 56. resolve: 結合
Path base = Path.of("/home/user");
System.out.println(base.resolve("docs")); // /home/user/docs
// 引数が絶対パスなら、引数がそのまま返る(ひっかけ!)
System.out.println(base.resolve("/etc")); // /etc

// 55. relativize: 相対パスの作成(p1から見てp2はどこか)
Path pathA = Path.of("a/b");
Path pathB = Path.of("a/c/d");
System.out.println(pathA.relativize(pathB)); // ../c/d

// 54. normalize: 不要な記号の解消
Path dirty = Path.of("/home/./user/../admin");
System.out.println(dirty.normalize()); // /home/admin

66-85. Filesクラスによる実操作

物理的なファイル操作(コピー、移動、削除)と属性の扱いです。

Java
Path src = Path.of("source.txt");
Path dest = Path.of("target.txt");

// 66, 67. 存在と同一性
if (Files.exists(src) && !Files.isSameFile(src, dest)) {
    // 70, 74. コピー(上書きオプション)
    Files.copy(src, dest, StandardCopyOption.REPLACE_EXISTING);
}

// 76, 77. 読み込み
List<String> lines = Files.readAllLines(src); // 小さいファイル用
// 78, 79. Streamによる読み込み(巨大ファイル用・要close)
try (Stream<String> stream = Files.lines(src)) {
    stream.filter(s -> s.startsWith("ERROR")).forEach(System.out::println);
}

// 80, 81. 属性の取得
BasicFileAttributes attr = Files.readAttributes(src, BasicFileAttributes.class);
System.out.println(attr.size());
System.out.println(attr.creationTime());

86-100. ファイルの探索と再帰処理

Streamを使った探索と、より細かい制御ができる FileVisitor です。

Java
Path start = Path.of("./project");

// 87. Files.walk: 全てのサブディレクトリ・ファイルを再帰的に取得
try (Stream<Path> walk = Files.walk(start, 5)) { // 深さ5まで
    walk.filter(p -> p.toString().endsWith(".java")).forEach(System.out::println);
}

// 88. Files.find: 条件を指定して探索
try (Stream<Path> found = Files.find(start, 10, 
        (path, attr) -> attr.size() > 1024 && path.toString().endsWith(".log"))) {
    found.forEach(System.out::println);
}

// 90-97. FileVisitorによる詳細制御
class MyVisitor extends SimpleFileVisitor<Path> {
    @Override // 93. ファイル到達時
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
        System.out.println("File: " + file);
        return FileVisitResult.CONTINUE; // 96. 続行
    }

    @Override // 92. ディレクトリに入る前
    public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) {
        if (dir.getFileName().toString().equals(".git")) {
            return FileVisitResult.SKIP_SUBTREE; // 98. この下は見ない
        }
        return FileVisitResult.CONTINUE;
    }
}
Files.walkFileTree(start, new MyVisitor());

💡 Java Gold 試験対策:NIO.2の最終チェック

項目 試験のポイント
relativize 両方のパスが「共に絶対パス」か「共に相対パス」である必要がある。混在は例外。
isSameFile パス文字列が違っても、ハードリンク等で中身が同じなら true。ただし、まずファイルが存在するかチェックする。
Files.list 再帰しない。直下だけ。再帰したいなら Files.walk
FileVisitResult CONTINUE, TERMINATE, SKIP_SUBTREE, SKIP_SIBLINGS の4種類を区別する。
Stream のクローズ Files.lines, Files.walk, Files.listtry-with-resources が必須。

これで全ての分野(並列処理、Stream、関数型、JDBC、NIO.2)の100本ノックが完了しました!

合格への総仕上げとして、最後に何をしましょうか?

  1. 全分野ミックスの「本番想定・10問ミニテスト」(最も効果的な仕上げです)
  2. 特定の苦手なメソッドの「深掘り解説」
  3. 試験によく出る「例外クラス一覧」の整理

ご希望を教えてください!