今日はファイルの複数アトリビュートの取得について見ていきましょう。
FilesクラスのgetAttributeメソッドではアトリビュートを1つずつ取得しなくてはなりません。
ファイルの作成日時と最終更新日時などの関連するアトリビュートでも、
まとめて取得することができません。
この問題はアトリビュートの取得だけでなく、設定する場合にもあてはまります。
そこで今回は複数のアトリビュートをまとめて取得する方法について見てみましょう。
取得するアトリビュートはOSごとに異なるため、3種類のインターフェースが提供されています。
BasicFileAttributesインターフェースはOSによらない、
共通のアトリビュートを取得するために使用します。
OSに依存するアトリビュートは、BasicFileAttributesインターフェースのサブインターフェースとして
定義されています。
Windows用に使用するのがDosFileAttributesインターフェース、LinuxやMac OS Xのような
POSIX準拠のOS用に使用するのがPosixFileAttributesインターフェースです。
では、これらのインターフェースを使用してアトリビュートを取得してみましょう。
取得するのはFilesクラスのreadAttributesメソッドを使用します。
readAttributesメソッドの第1引数はPathインターフェース、第2引数はClassクラスです。
第2引数でどのインターフェースを取得するかを指定します。
取得できないインターフェースを指定した場合、nullが返ります。
たとえば、WindowsでPosixFileAttributesオブジェクトを取得しようとしても、nullが返ります。
第3引数は可変長引数で、引数の型はLinkOption列挙型です。
リンクを追わないようにする場合、第3引数にNOFOLLOW_LINKSを指定します。
まず、Windowsのアトリビュートを取得してみます。
// 対象となるバス
Path path = Paths.get("var.txt");
// Windows用のDosFileAttributesオブジェクトの取得
DosFileAttributes attributes = Files.readAttributes(path, DosFileAttributeView.class);
// BasicFileAttributesインターフェースで定義されたメソッド
System.out.println("Creation Time: " + attributes.creationTime());
System.out.println("Last Modified Time: " + attributes.lastModifiedTime());
System.out.println("Last Access Time: " + attributes.lastAccessTime());
System.out.println("File: " + attributes.isRegularFile());
System.out.println("Directory; " + attributes.isDirectory()):
System.out.println("Symbolic Link: " + attributes.isSymbolicLink());
// DosFileAttributesインターフェースで定義されたメソッド
System.out.println("System File: " + attributes.isSystem());
readAttributesの第2引数にDosFileAttribute.classを指定することで、
DosFileAttributesオブジェクトを取得できます。
DosFileAttributesインターフェースでは、スーパーインターフェースのBasicFileAttributes
インターフェースで定義されたOSに共通のアトリビュートを取得するメソッドと、
Windowsだけで取得可能なアトリビュートを取得できるメソッドを使用することができます。
ファイルの作成時を取得するcreationTimeメソッドなどはBasicFileAttributesインターフェース
で定義されたメソッドです。
これに対し、isSystemメソッドがDosFileAttributesインターフェースで定義されたメソッドになります。
同様にLinuxやMac OS X のようなPOSIX準拠OSでもアトリビュートをまとめて取得してみましょう。
// 対象となるパス
Path path = Paths.get("var.txt");
// POSIX準拠OS用のPosixFileAttributesオブジェクトの取得
PosixFileAttributes attributes = Files.readAttributes(path, PosixFileAttributeView.class);
// BasicFileAttributesインターフェースで定義されたメソッド
System.out.println("Creation Time: " + attributes.creationTime());
System.out.println("Last Modified Time: " + attributes.lasoModifiedTime());
System.out.println("Last Access TIme: " + attributes.lastAccessTime());
System.out.println("File: " + attributes.isRegularFile());
System.out.println("Directory: " + attributes.isDirectory());
System.out.println("Symbolic Link: " + attributes.isSymbolicLink());
// PosixFileAttributesインターフェースで定義されたメソッド
System.out.println("Owner: " + attributes.owner());
System.out.println("Permission: " + PosixFilePermissions.toString(attributes.permissions()));
DosFileAttributesインターフェースの代わりにPosixFileAttributesインターフェースを使用
していること以外はほぼ同じです。
ファイルの属性をまとめて取得できることでプログラミングでできる幅が広がりましたね!
では今日はこの辺で!
人気ブログランキングへ