シンポリックリンク
シンボリックリンク(シンボリックリンク、以下シンクロ)の扱いは、Java SE 11 Gold試験で「実行結果を予想させる問題」としてよく出題されます。
特に、**Files クラスのメソッドがデフォルトでリンク先を「追う(Follow)」のか「追わない(No Follow)」のか**の違いが重要です。
1. シンボリックリンクの作成と判定¶
まずは基本となる作成と、それがリンクであるかどうかの判定です。
Java
Path target = Paths.get("C:/data/report.txt");
Path link = Paths.get("C:/data/link_to_report.txt");
try {
// シンボリックリンクの作成
Files.createSymbolicLink(link, target);
// 判定
System.out.println(Files.isSymbolicLink(link)); // true
// リンクの参照先を取得
Path actualTarget = Files.readSymbolicLink(link);
System.out.println(actualTarget); // C:\data\report.txt
} catch (IOException e) {
e.printStackTrace();
}
2. 試験頻出:Files.walk() の挙動¶
Files.walk() は、デフォルトでは**シンボリックリンクをたどりません。** リンクそのものを一つのファイルとして扱い、その先のディレクトリの中身までは見に行きません。
サンプルコード¶
Java
Path root = Paths.get("C:/test_dir"); // この中にディレクトリへのシンボリックリンクがあるとする
// パターンA:デフォルト(リンクをたどらない)
Files.walk(root)
.forEach(System.out::println);
// パターンB:リンクをたどる(FOLLOW_LINKS オプション)
Files.walk(root, FileVisitOption.FOLLOW_LINKS)
.forEach(System.out::println);
注意点:
FOLLOW_LINKSを使う場合、リンクが循環(自分自身の親ディレクトリを指すなど)しているとFileSystemLoopExceptionが発生する可能性があります。これも試験で問われることがあります。
3. コピーと移動の挙動 (CopyOption)¶
ファイルをコピーする際、シンボリックリンクを「リンクとしてコピーする」のか「リンク先のデータ本体をコピーする」のかを指定します。
NOFOLLOW_LINKS: リンクそのものをコピー(または移動)の対象にします。- デフォルト: 多くの操作でリンク先(実体)が対象になります。
Java
Path link = Paths.get("link_file");
Path target = Paths.get("new_file");
// リンクそのものではなく、リンクが指している「実体」の内容を target にコピーする
Files.copy(link, target);
// リンクという「ファイル(参照)」そのものをコピーする
Files.copy(link, target, LinkOption.NOFOLLOW_LINKS);
4. 試験対策のチェックリスト¶
-
Files.isSameFile(path1, path2):- 2つのパスが異なる場所にあっても、一方がもう一方のシンボリックリンクであれば
trueを返します。
- 2つのパスが異なる場所にあっても、一方がもう一方のシンボリックリンクであれば
-
Files.delete():- シンボリックリンクを削除しても、リンク先の実体ファイルは削除されません。
-
LinkOption.NOFOLLOW_LINKS:Files.exists(path, options)などで使われます。「リンクが存在するか」を見たいのか、「リンク先のファイルが存在するか」を見たいのかを区別します。
次のステップ¶
シンボリックリンクの挙動は理解できましたか?
もしよろしければ、NIO.2と組み合わせて出題されやすい 「try-with-resources」 や 「例外処理のルール」 について確認しますか?あるいは、まだ触れていない 「JDBC(データベース操作)」 に進みましょうか?