java.nio.fileパッケージ、特にPathクラスは"リンクの認識"が可能です。 すべてのPathメソッドでは、シンボリック・リンクがある場合の対処方法が自動的に検出されるか、またはシンボリック・リンクがある場合の動作をオプションで設定できます。
これまでシンボリック・リンク(ソフト・リンク)について説明してきましたが、一部のファイル・システムではハード・リンクもサポートされます。 ハード・リンクは次の点で、シンボリック・リンクよりも強い制限があります。
これらの制約があるため、ハード・リンクはシンボリック・リンクほど頻繁には使用されませんが、Pathメソッドはハード・リンクともシームレスに動作します。
リンクを処理するための専用のメソッドがいくつかあります。これらは次のセクションで説明します。
ファイル・システムでサポートされる場合は、createSymbolicLink(Path, Path, FileAttribute<?>)メソッドを使用してシンボリック・リンクを作成できます。 2つ目のPath引数は、リンク先のファイルまたはディレクトリを表します。この指定は任意です。 次のコードでは、デフォルトの権限を持つシンボリック・リンクを作成します。
Path newLink = ...;
Path target = ...;
try {
Files.createSymbolicLink(newLink, target);
} catch (IOException x) {
System.err.println(x);
} catch (UnsupportedOperationException x) {
//一部のファイル・システムではシンボリック・リンクはサポートされません。
System.err.println(x);
}
FileAttribute可変引数で、リンクの作成時に原子的に設定される初期ファイル属性を指定できます。 ただし、この引数は将来のバージョンで対応予定であり、現在は実装されていません。
createLink(Path, Path)メソッドを使用して、既存のファイルに対するハード・リンク(通常のリンク)を作成できます。 2つ目のPath引数は既存のファイルの場所を特定するものです。このファイルは存在している必要があり、存在しない場合はNoSuchFileExceptionがスローされます。 リンクは次のように作成します。
Path newLink = ...;
Path existingFile = ...;
try {
Files.createLink(newLink, existingFile);
} catch (IOException x) {
System.err.println(x);
} catch (UnsupportedOperationException x) {
//一部のファイル・システムではディレクトリに対して既存のファイルを追加する操作はサポートされません。
System.err.println(x);
}
Pathインスタンスがシンボリック・リンクであるかどうかを判断するには、isSymbolicLink(Path)メソッドを使用できます。 このメソッドは次のように使用します。
Path file = ...; boolean isSymbolicLink = Files.isSymbolicLink(file);
readSymbolicLink(Path)メソッドを次のように使用して、シンボリック・リンクのリンク先を取得できます。
Path link = ...;
try {
System.out.format("Target of link '%s' is '%s'%n", link, Files.readSymbolicLink(link));
} catch (IOException x) {
System.err.println(x);
}
Pathがシンボリック・リンクでない場合、このメソッドはNotLinkExceptionをスローします。