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.list は try-with-resources が必須。 |
これで全ての分野(並列処理、Stream、関数型、JDBC、NIO.2)の100本ノックが完了しました!
合格への総仕上げとして、最後に何をしましょうか?
- 全分野ミックスの「本番想定・10問ミニテスト」(最も効果的な仕上げです)
- 特定の苦手なメソッドの「深掘り解説」
- 試験によく出る「例外クラス一覧」の整理
ご希望を教えてください!