先月に引き続き、今月もNIO2で導入されたファイルシステムインタフェースについて紹介していきます。

 簡単に前回のおさらいをしておきましょう。

 新しいファイルシステムインタフェースは、既存のFileクラスの欠点を解決すべく導入されたAPIです。

 ファイルシステムを表すのがjava.nio.file.FileSystemクラス、java.io.Fileクラスに対応するのがjava.nio.file.Pathインタフェースです。Pathオブジェクトに対するユーティリティメソッドはjava.nio.file.Filesクラスで提供されています。

 先月はPathオブジェクトの生成、Fileオブジェクトとの相互変換、入出力などに関して説明を加えました。今月はFilesクラスで提供している機能を中心に説明を加えていきます。

ファイル・ディレクトリの作成

 はじめに、ファイルやディレクトリを作成するところからはじめましょう。

 ファイルやディレクトリを作成することはFileクラスでもできました。もちろん、新しいファイルシステムインタフェースでも可能です。しかし、Pathインタフェースの機能ではなく、Filesクラスの機能として提供されています。

サンプルのソース (こちらからダウンロードできます)
・CreationDemo.java

 なお、今月はLinuxで実行することも多いので、ソースの文字コードをUTF-8にしてあります。もし、Windowsのコマンドラインでコンパイルを行う場合、javacのオプションとして-encoding UTF-8を指定してください。

ファイルの作成

 では、まずファイルの作成から行ってみましょう。

リスト1●ファイルの作成
        // ファイルの作成
        Path foo = fileSystem.getPath("foo.txt");
        Files.createFile(foo);

 ファイルの作成はFilesクラスのcreateFileメソッドで行います。引数はPathオブジェクトです。

 このソースを実行すると、ファイルサイズが0のfoo.txtファイルが作成されます。

 既に存在するファイルを作成しようとするとjava.nio.file.FileAlreadyExistsException例外がスローされます。また、存在しないディレクトリにファイルを作成しようとすると、java.nio.file.NoSuchFileException例外がスローされます。

 LinuxやSolarisなどPOSIX準拠のOSでは、ファイルの作成時にパーミッションを指定することができます。例えば、読み込み専用のファイルを作成する場合をリスト2に示します。

リスト2●パーミッションを指定したファイルの作成
        // ファイルの作成(パーミッション指定)
        Path bar = fileSystem.getPath("bar.txt");
 
        Set<PosixFilePermission> filePermission 
            = PosixFilePermissions.fromString("r--r--r--");
        FileAttribute<Set<PosixFilePermission>> attribute 
            = PosixFilePermissions.asFileAttribute(filePermission);
            
        Files.createFile(bar, attribute);

 ファイルのパーミッションは赤字で示したように、createFileメソッドの第2引数で示します。第2引数の型はjava.nio.file.attribute.FileAttributeインタフェースです。

 FileAttributeインタフェースはnameメソッドとvalueメソッドを定義したインタフェースです。nameメソッドでアトリビュートの名前、valueメソッドでアトリビュートの値を返すようにします。実装クラスを自作することも可能ですが、ここではjava.nio.file.attribute.PosixFilePermissionsクラスを使用して、FileAttributeオブジェクトを生成します。

 PosixFIlePermissioinsクラスは、クラス名の最後に複数形のsがついていることからわかるように、enumのjava.nio.file.attribute.PosixFilePermissionのためのユーティリティメソッドを提供しています。

 まず、青文字で示したようにPosixFilePermissionsクラスのfromStringメソッドでFilePermissionオブジェクトを保持したjava.util.Setオブジェクトを生成します。

 fromStringメソッドの引数は、Unix系のOSでファイルパーミッションを表す文字列です。例えば、r--r--r--は、読み込み専用であることを示しています。

 こうして得られたFilePermissionオブジェクトのセットから、オレンジで示したasFileAttributeメソッドを使用して、FileAttributeオブジェクトを作成します。

 そして、このFileAttributeオブジェクトをcreateFileメソッドの引数に指定することで、パーミッションを指定できます。

 では、このソースを実行してみましょう。ここでは、Ubuntuで実行しました。

$ java CreationDemo  
$ ls -l
合計 8
-rw-r--r-- 1 sakuraba sakuraba 1146 2011-08-21 22:42 CreationDemo.class
-rwxr-xr-x 1 sakuraba sakuraba 1987 2011-08-21 22:42 CreationDemo.java
-r--r--r-- 1 sakuraba sakuraba    0 2011-08-21 22:42 bar.txt
-rw-r--r-- 1 sakuraba sakuraba    0 2011-08-21 22:42 foo.txt

 先ほど作成したfoo.txtはオーナーによる書き込みが可能なのに対し、bar.txtは読み込み専用になっていることがわかります。

 なお、WindowsではPOSIXのパーミッションを採用していないため、java.lang.UnsupportedOperationException例外がスローされます。

この先は会員の登録が必要です。今なら有料会員(月額プラン)登録で6月末まで無料!

日経 xTECHには有料記事(有料会員向けまたは定期購読者向け)、無料記事(登録会員向け)、フリー記事(誰でも閲覧可能)があります。有料記事でも、登録会員向け配信期間は登録会員への登録が必要な場合があります。有料会員と登録会員に関するFAQはこちら