先月に引き続き、今月も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例外がスローされます。