JDK 1.7當中的文件屬性、權限操作

在JDK1.7當中新增了對文件操作的一些API接口,此Demo特點:

  • 讀取文件的屬性
  • 讀取文件的權限,RWX格式,Number格式
  • 修改文件的權限
  • 權限格式的轉換:RWX格式與Number格式

二次修改說明:

  • 參數命名 首字母小寫
  • 添加異常捕獲,需要引用第三方apache BizCoreException jar包

package com.idcos.cloud.core.common.util;

import java.io.File;
import java.io.IOException;
import java.nio.file.FileSystem;
import java.nio.file.Files;
import java.nio.file.attribute.GroupPrincipal;
import java.nio.file.attribute.PosixFileAttributeView;
import java.nio.file.attribute.PosixFileAttributes;
import java.nio.file.attribute.PosixFilePermission;
import java.nio.file.attribute.PosixFilePermissions;
import java.nio.file.attribute.UserPrincipal;
import java.nio.file.attribute.UserPrincipalLookupService;
import java.util.Set;

import com.idcos.common.biz.BizCoreException;

public class FileAttributesUtil {

    /**
     * 獲取文件系統信息
     * @param file
     * @return
     */
    public static FileSystem getFileSystem(File file) {
        return file.toPath().getFileSystem();
    }

    public static UserPrincipalLookupService getUserPrincipalLookupService(File file) {
        return getFileSystem(file).getUserPrincipalLookupService();
    }

    public static GroupPrincipal getGroupPrincipal(File file, String groupName) {
        try {
            return getUserPrincipalLookupService(file).lookupPrincipalByGroupName(groupName);
        } catch (IOException e) {
            throw new BizCoreException("獲取group名稱:" + groupName + "異常", e);
        }
    }

    public static UserPrincipal getUserPrincipal(File file, String userName) {
        try {
            return getUserPrincipalLookupService(file).lookupPrincipalByName(userName);
        } catch (IOException e) {
            throw new BizCoreException("獲取user名稱:" + userName + "異常", e);
        }
    }

    public static PosixFileAttributeView getPosixFileAttributeView(File file) {
        return Files.getFileAttributeView(file.toPath(), PosixFileAttributeView.class);
    }

    public static PosixFileAttributes getPosixFileAttributes(File file) {
        try {
            return getPosixFileAttributeView(file).readAttributes();
        } catch (IOException e) {
            throw new BizCoreException("獲取文件屬性異常", e);
        }
    }

    /**
     * 修改文件用戶組
     * @param file 文件
     * @param groupName 用戶組名稱
     * @throws IOException
     */
    public static void setFileGroup(File file, String groupName) {
        try {
            getPosixFileAttributeView(file).setGroup(getGroupPrincipal(file, groupName));
        } catch (IOException e) {
            throw new BizCoreException("寫入文件group信息異常", e);
        }

    }

    /**
     * 修改文件用戶
     * @param file 文件
     * @param userName 用戶名稱
     * @throws IOException
     */
    public static void setFileUser(File file, String userName) {
        try {
            getPosixFileAttributeView(file).setOwner(getUserPrincipal(file, userName));
        } catch (IOException e) {
            throw new BizCoreException("寫入文件user信息異常", e);
        }
    }

    /**
     * 修改文件權限
     * @param file 文件 
     * @param posixFilePermissionNumber 數字類型的權限,如:777
     * @throws IOException
     */
    public static void setFilePermissions(File file, String posixFilePermissionNumber) {
        try {
            getPosixFileAttributeView(file)
                .setPermissions(
                    parsePosixFilePermissiontoSet(parsePosixFilePermissiontoRWX(posixFilePermissionNumber)));
        } catch (IOException e) {
            throw new BizCoreException("寫入文件權限信息異常", e);
        }
    }

    /**
     * 修改文件權限
     * @param file 文件
     * @param perms 文件權限數組
     * @throws IOException
     */
    public static void setFilePermissions(File file, Set<PosixFilePermission> perms) {
        try {
            getPosixFileAttributeView(file).setPermissions(perms);
        } catch (IOException e) {
            throw new BizCoreException("寫入文件權限信息異常", e);
        }
    }

    /**
     * 將RWX類型的文件權限修改爲Set
     * @param posixFilePermission 
     * @return
     */
    public static Set<PosixFilePermission> parsePosixFilePermissiontoSet(String posixFilePermission) {
        return PosixFilePermissions.fromString(posixFilePermission);
    }

    /**
     * 將String rwx類型的權限轉換爲String 數字類型
     * 如:rw-r----- 轉換爲 640
     * @param PosixFilePermission
     * @return
     */
    public static String parsePosixFilePermissiontoNum(Set<PosixFilePermission> set) {
        int user = 0;
        int group = 0;
        int other = 0;
        for (PosixFilePermission permission : set) {

            switch (permission) {

                case OWNER_READ:
                    user = user | 4;
                    break;
                case OWNER_WRITE:
                    user = user | 2;
                    break;
                case OWNER_EXECUTE:
                    user = user | 1;
                    break;
                case GROUP_READ:
                    group = group | 4;
                    break;
                case GROUP_WRITE:
                    group = group | 2;
                    break;
                case GROUP_EXECUTE:
                    group = group | 1;
                    break;
                case OTHERS_READ:
                    other = other | 4;
                    break;
                case OTHERS_WRITE:
                    other = other | 2;
                    break;
                case OTHERS_EXECUTE:
                    other = other | 1;
                    break;
            }
        }
        return "" + user + group + other;
    }

    /**
     * 
     * 將String 數字類型的權限轉換爲String rwx類型
     * 如:640 轉換爲 rw-r----- 
     * @param posixFilePermission
     * @return
     */
    public static String parsePosixFilePermissiontoRWX(String posixFilePermission) {
        String returnString = "";
        char[] perStringArr = posixFilePermission.toCharArray();
        for (char x : perStringArr) {
            if ((x & 4) == 4) {
                returnString += "r";
            } else {
                returnString += "-";
            }
            if ((x & 2) == 2) {
                returnString += "w";
            } else {
                returnString += "-";
            }
            if ((x & 1) == 1) {
                returnString += "x";
            } else {
                returnString += "-";
            }
        }

        return returnString;
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章