Skip to content
閲覧中:
シンポリックリンク

シンポリックリンク

シンボリックリンク(シンボリックリンク、以下シンクロ)の扱いは、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. 試験対策のチェックリスト

  1. Files.isSameFile(path1, path2):

    • 2つのパスが異なる場所にあっても、一方がもう一方のシンボリックリンクであれば true を返します。
  2. Files.delete():

    • シンボリックリンクを削除しても、リンク先の実体ファイルは削除されません。
  3. LinkOption.NOFOLLOW_LINKS:

    • Files.exists(path, options) などで使われます。「リンクが存在するか」を見たいのか、「リンク先のファイルが存在するか」を見たいのかを区別します。

次のステップ

シンボリックリンクの挙動は理解できましたか?

もしよろしければ、NIO.2と組み合わせて出題されやすい 「try-with-resources」「例外処理のルール」 について確認しますか?あるいは、まだ触れていない 「JDBC(データベース操作)」 に進みましょうか?