メタデータ

 ファイルやディレクトリのアトリビュートなど、メタデータを扱うためには2種類の方法があります。

 一方がFilesクラスで直接メタデータを扱う方法、もう一方がjava.nio.file.attribute.FileAttributeViewインタフェースを使用する方法です。

 それぞれの方法について、説明を加えていきます。

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

Filesクラスでメタデータを扱う

 FilesクラスにはgetOwnerメソッド、setOwnerメソッドのようにファイル・ディレクトリのアトリビュートを取得、設定するメソッドが定義されています。

 しかし、Filesクラスで提供しているアトリビュートの取得、設定のメソッドは必要最低限です。例えば、ファイルの最終更新日時は取得できますが、作成日時は取得できません。

 このような場合、getAttributeメソッド、setAttribuuteメソッドを使用します。

リスト12●Filesクラスからファイルのアトリビュートを取得
    private void showAttributesFromFiles(Path path) throws IOException {
        // オーナー
        UserPrincipal owner = Files.getOwner(path);
        System.out.println("Owner: " + owner);
        
        // 最終更新日時
        FileTime lastModifiedTime = Files.getLastModifiedTime(path);
        System.out.println("Lst Modified Time: " + lastModifiedTime);
        
        // シンボリックリンクであるかどうか
        boolean isSymbolicLink = Files.isSymbolicLink(path);
        System.out.println("Is SymbolicLink?: " + isSymbolicLink);
        
        // 作成日時
        FileTime creationTime 
            = (FileTime)Files.getAttribute(path, "creationTime");
        System.out.println("Creation Time: " + creationTime);
    }

 オーナー情報は青字で表したjava.nio.file.attribute.UserPrincipalインタフェースで表します。

 オーナーを設定するために他のUserPrincipalオブジェクトを取得するには、java.nio.file.attribute.UserPrincipalLookupServiceクラスのlookupPrincipalByNameメソッドを使用します。

 最終更新日時や、作成日時を表すのに使用されるのが、オレンジで示したjava.nio.file.attribute.FileTimeクラスです。

 赤字で示した部分が、前述したgetAttributeメソッドを使用している個所です。第2引数でアトリビュートの名称を指定します。ここでは作成日時を取得するために"creationTime"を指定しています。

 getAttributeメソッドの戻り値の型はObjectクラスなので、キャストが必要になります。

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

C:\nio2>java MetadataDemo
Name: foo.txt
Owner: coconut\sakuraba (User)
Lst Modified Time: 2011-08-22T06:33:14.432783Z
Is SymbolicLink?: false
Creation Time: 2011-08-18T12:31:02.646665Z

 FileTimeクラスの文字列表現が見慣れない型式になっています。これはISO 8601で定義されている表記法でYYYY-MM-DDThh:mm:ss[.s+]Z のように記述します。

FileAttributeViewインタフェースでメタデータを扱う

 FilesクラスのgetAttribute/setAttributeメソッドを使用すれば、任意のアトリビュートを扱えることがわかりました。しかし、アトリビュート名を文字列で指定しなくてはいけない点、キャストが必要である点などが、気になるところです。

 これを解決するのがFileAttributeViewインタフェースを使用する手法です。

 ファイルのメタデータはプラットフォームに依存します。そこで、プラットフォームごとに使用できるFileAttributeViewインタフェースのサブインタフェースが定義されています。

 Windows、Linux、Solarisのいずれでも使用できるのがBasicFileAttributeViewインタフェース、Windows特有のアトリビュートを扱うのがDosFileAttributeViewインタフェース、LinuxなどPosixに準拠しているOSで使用できるのがPosixFileAttributeViewインタフェースです。

 また、アクセスコントロールを扱うAclFileAttributeViewインタフェースや、オーナー情報を扱うFileOwnerAttributeViewインタフェースなどが提供されいてます。

 ここでは、BasicFileAttributeViewインタフェースを使用してみます。

リスト13●FileAttributeViewインタフェースを使用してアトリビュートを扱う
    private void showAttributesFromFileAttributeView(Path path)
            throws IOException {
 
        // FileAttributeViewオブジェクトを取得
        // getFileAttributeViewメソッドの第2引数で取得する
        // FileAttributeViewインタフェースのサブインタフェースを指定
        BasicFileAttributeView view
            = Files.getFileAttributeView(path,
                                         BasicFileAttributeView.class);
 
        // アトリビュートを保持するBasicFileAttributesインタフェースの
        // オブジェクトを取得
        BasicFileAttributes attributes
            = view.readAttributes();
         
        // 作成日時
        FileTime creationTime = attributes.creationTime();
        System.out.println("Creation Time: " + creationTime);
 
        // 最終アクセス日時
        FileTime lastAccessTime = attributes.lastAccessTime();
        System.out.println("Last Access Time: " + lastAccessTime);
 
        // サイズ
        long size = attributes.size();
        System.out.println("Size: " + size + " byte");
    }

 FilesクラスのgetFileAttributeViewメソッドは第2引数でClassクラスを指定します。この第2引数で指定されたFileAttributeViewインタフェースのサブインタフェースが、getFileAttributeViewメソッドの戻り値になります。

 ここでは第2引数にBasicFileAttributeView.classを指定しているので、戻り値としてBasicFileAttributeViewオブジェクトが得られます。

 FileAttributeViewインタフェースは、名前にViewとついていることからもわかるように、アトリビュートそのものを保持しているわけではありません。

 どのようにアトリビュートを保持するかは、FileAttributeViewインタフェースのサブインタフェースごとに異なります。例えば、BasicFileAttributeViewインタフェースでは、BasicFileAttributesインタフェースでアトリビュートを表します。

 BasicFileAttributesインタフェースではcreationTimeメソッドや、isDirectoryメソッドなど、アトリビュートを取得するためのメソッドが定義されています。

 では、実行してみましょう。前半は先ほどのFilesクラスから直接取得したアトリビュート、後半がFileAttributeViewインタフェースを使用した方法です。

C:\nio2>java MetadataDemo
Name: foo.txt
Owner: coconut\sakuraba (User)
Lst Modified Time: 2011-08-22T06:33:14.432783Z
Is SymbolicLink?: false
Creation Time: 2011-08-18T12:31:02.646665Z
 
Creation Time: 2011-08-18T12:31:02.646665Z
Last Access Time: 2011-08-22T06:33:14.432783Z
Size: 16645 byte

 FileAttributeViewインタフェースを使用した手法ではキャストは必要ないものの、手順がちょっと多くなってしまいます。用途に応じて、2種類の手法を使い分けるのがよさそうです。

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

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