このページを正しく表示するには、ブラウザでJavaScriptを有効にする必要があります。
コース: 重要なクラス
レッスン: 基本的なI/O
セクション: ファイルI/O(NIO.2を含む)
パス(およびその他のファイル・システム要素)について
ホームページ > 重要なクラス > 基本的なI/O

パス(およびその他のファイル・システム要素)について

ファイル・システムは、後で簡単に取得できるような方法で、ファイルを何らかの形式のメディア(通常は1つ以上のハード・ドライブ)に保存して整理するシステムです。 今日使用されているほとんどのファイル・システムでは、ファイルはツリー構造(階層構造)で保存されます。 ツリーの最上位に位置するのは、1つ(または複数)のルート・ノードです。 ルート・ノードの下には、ファイルおよびディレクトリ(Microsoft Windowsではフォルダー)があります。 各ディレクトリにはファイルとサブディレクトリを格納できます。このサブディレクトリにも同様にファイルとサブディレクトリを格納でき、可能性としては、これをほぼ無限の深さまで続けることができます。

このセクションでは次の内容について説明します。

パスとは何か

次の図は、単一のルート・ノードを含むディレクトリ・ツリーのサンプルです。 Microsoft Windowsでは、複数のルート・ノードを利用できます。 各ルート・ノードは、C:\D:\といったボリュームにマッピングされます。 Solaris OSでは、ルート・ノードは単一で、スラッシュ文字(/)で表されます。

Sample directory structure

ディレクトリ構造のサンプル

ファイル・システムでは、ファイルはルート・ノードから始まるパスによって特定されます。 たとえば、上の図のstatusReportファイルは、Solaris OSでは次のように表します。
/home/sally/statusReport
Microsoft Windowsでは、statusReportファイルは次のように表します。
C:\home\sally\statusReport
ディレクトリ名を区切るために使用する文字(デリミタ)はファイル・システムによって異なります。 Solaris OSでは通常のスラッシュ(/)を使用し、Microsoft Windowsではバックスラッシュ(\)を使用します。

相対パスと絶対パス

パスには、相対パス絶対パスがあります。 絶対パスは、ルート要素と、ファイルの場所を特定するために必要なすべてのディレクトリのリストが常に含まれるパスです。 たとえば、/home/sally/statusReportは絶対パスです。 このパス文字列には、ファイルの場所を特定するために必要なすべての情報が含まれています。

相対パスは、ファイルにアクセスするためには他のパスと結合する必要があるパスです。 たとえば、joe/fooは相対パスです。 追加の情報がなければ、プログラムでファイル・システム内のjoe/fooディレクトリの場所を確実に特定することはできません。

シンボリック・リンク

ファイル・システムのオブジェクトのほとんどはディレクトリかファイルです。 ディレクトリやファイルについては、説明するまでもないでしょう。 しかし、一部のファイル・システムでは、シンボリック・リンクという概念もサポートされています。 シンボリック・リンクは、symlinkまたはソフト・リンクとも呼ばれます。

シンボリック・リンクは、他のファイルへの参照として機能する特殊なファイルです。 ほとんどの場合、アプリケーションではシンボリック・リンクを特別に意識する必要はなく、シンボリック・リンクに対する操作は自動的にリンク先に反映されます(リンク先とは、参照するファイルまたはディレクトリのことです)。 ただし、シンボリック・リンクを削除する場合とシンボリック・リンクの名前を変更する場合は例外となります。この場合、それぞれ削除または名前変更されるのはシンボリック・リンク自体であり、リンク先には反映されません。

次の図では、logFileは、ユーザーには通常のファイルに見えますが、実際にはdir/logs/HomeLogFileへのシンボリック・リンクです。 HomeLogFileが、リンク先です。

Sample symbolic link

シンボリック・リンクのサンプル

通常、シンボリック・リンクの動作をユーザーが特に意識することはありません。 シンボリック・リンクの読取りや書込みは、その他のファイルやディレクトリの読取りや書込みと同じように行うことができます。

シンボリック・リンクの代わりにファイル・システム内の実際の場所を使用することを、リンクを解決するといいます。 このサンプルでは、logFileが解決されると、dir/logs/HomeLogFileを使用することになります。

現実世界のシナリオでは、ほとんどのファイル・システムでシンボリック・リンクを自由に使用できます。 そのため、ときには、不注意に作成されたシンボリック・リンクによって循環参照が生じることもあります。 循環参照とは、リンク先がリンク元を参照する状態のことです。 循環参照は直接的なものだけではなく、たとえばディレクトリaがディレクトリbを参照し、ディレクトリbがディレクトリcを参照し、ディレクトリcにディレクトリaを参照するサブディレクトリが含まれるような場合には、間接的な循環参照が発生します。 プログラムで再帰的にディレクトリ構造を操作している場合に循環参照があると、大きな問題となります。 ぜひ、ここで説明したシナリオを参考に、無限ループの発生しないプログラムを作成してください。

次のページでは、Javaプログラミング言語でのファイルI/Oサポートの中心となる、Pathクラスについて説明します。


サンプル・プログラムで問題が発生した場合は、 Compiling and Running the Examples: FAQsを参照してください。
フィードバックをお寄せください。さまざまなご意見をお待ちしております。

前のページ: ファイルI/O(NIO.2を含む)
次のページ: Pathクラス