先月に引き続き、今月も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を指定してください。
ファイルの作成
では、まずファイルの作成から行ってみましょう。
// ファイルの作成
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に示します。
// ファイルの作成(パーミッション指定)
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例外がスローされます。