コンテンツタイプとファイル属性の確認方法

Java7ではコンテンツタイプの確認とファイル属性を確認するためのAttributeViewが提供されています。

とりあえず忘れないためにサンプルプログラムをメモ。

import java.io.IOException;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.LinkOption;
import java.nio.file.Path;
import java.nio.file.attribute.AclEntry;
import java.nio.file.attribute.AclFileAttributeView;
import java.nio.file.attribute.BasicFileAttributes;
import java.nio.file.attribute.FileOwnerAttributeView;
import java.nio.file.attribute.UserPrincipal;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class Main {

    public static void main(String[] args) throws Exception {
        Path path = FileSystems.getDefault().getPath("path_to_file");
        // ファイルタイプの確認
        System.out.println(Files.probeContentType(path));
        try {
            System.out.println("-------------------------------------");
            // ファイル属性の確認
            // "*"は全属性を取得
            Map<String, Object> attrs = Files.readAttributes(path, "*");
            Set<String> keys = attrs.keySet();
            for (String attr : keys) {
                System.out.println(attr + " : " + Files.getAttribute(path, attr));
            }

            System.out.println("-------------------------------------");
            // BasicFileAttributeViewを使ったファイル属性の確認
            BasicFileAttributes attributes = Files.readAttributes(path, BasicFileAttributes.class);
            System.out.println("Creation time : " + attributes.creationTime());
            System.out.println("Directory : " + attributes.isDirectory());
            System.out.println("Other : " + attributes.isOther());
            System.out.println("Regular file : " + attributes.isRegularFile());
            System.out.println("Symbolic link : " + attributes.isSymbolicLink());
            System.out.println("Last access time : " + attributes.lastAccessTime());
            System.out.println("Last modified time : " + attributes.lastModifiedTime());
            
            System.out.println("-------------------------------------");
            // FileOwnerAttributViewを使ったファイルオーナーの確認
            FileOwnerAttributeView ownerView = Files.getFileAttributeView(path, FileOwnerAttributeView.class);
            UserPrincipal userPrincipal = ownerView.getOwner();
            System.out.println("File owner : " + userPrincipal.getName());
            
            System.out.println("-------------------------------------");
            // AclFileAttributeViewのサンプル
            AclFileAttributeView aclView = Files.getFileAttributeView(path, AclFileAttributeView.class);
            List<AclEntry> aclEntries = aclView.getAcl();
            for (AclEntry aclEntry : aclEntries) {
                System.out.println("User name : " + aclEntry.principal().getName());
                System.out.println("ACL type : " + aclEntry.type());
                // display flags and permissions.
                System.out.println("ACL flags : " + aclEntry.flags().toString());
                System.out.println("Permissions : " + aclEntry.permissions().toString());
            }
           
        } catch (IOException e) {
            e.printStackTrace();
        }
        

    }

}

コンテンツタイプの確認はFilesクラスのクラスメソッドprobeContentTypeにPathオブジェクトを渡すことで、対象のコンテンツタイプを取得することが可能です。

上記サンプルではBasicFileAttributeView、FileOwnerAttributView、AclFileAttributeViewをサンプルとして挙げています。
ちなみにこれ以外に、PosixFileAttributeView、DosFileAttributeView、UserDefiniedAttributeViewが存在します。POSIXは主にUNIX系のOS、DOSWindows系のOSでサポートされている属性かと思います。
UserDefiniedAttributeViewは特殊で、ファイルやディレクトリに対して独自の属性を付与することができるようです。利用の仕方も独特でByteBufferを用いるようですが、あまり利用頻度は高そうにないので割愛します。

利用しているOSでどのファイル属性がサポートされているか確認するためには以下のコードで確認することが可能です。

// OSがサポートしているファイル属性の確認
FileSystem fileSystem = path.getFileSystem();
for (String viewName : fileSystem.supportedFileAttributeViews()) {
   System.out.println(viewName); 
}

メモなので出力結果が気になる方は適当に試してみてください。