鍍金池/ 教程/ Java/ Java文件所有者權(quán)限
Java文件屬性
Java FilePermission示例
Java Externalizable實例
Java文件操作
Java文件鎖
Java文件系統(tǒng)
Java異步I/O
Java Reader/Writer
Java File實例
Java FileReader示例
Java控制臺
Java文件所有者權(quán)限
Java通道
Java ByteArrayOutputStream示例
BufferedOutputStream示例
Java FileInputStream示例
Java DataInputStream
Java BufferedInputStream
Java Jar Manifest
Java Console類示例
BufferedWriter示例
Java輸入/輸出教程
Java對象序列化
Java文件教程
Java DataInputStream類型
Java Zip字節(jié)數(shù)組
Java FileWriter示例
FileOutputStream示例
Java PrintStream
Java Scanner類
BufferedInputStream示例
Java字符集
ByteArrayInputStream示例
Java路徑操作
Java DataOutputStream
Java符號鏈接
Java FilterWriter示例
Java Jar API
BufferedReader實例
Java Pipe(管道)
Java jar文件
Java CharArrayReader示例
Java CharArrayWriter示例
Java PushbackInputStream
Java FilterReader示例
Java zip文件
Java InputStream
Java標(biāo)準輸入/輸出/錯誤流
Java文件內(nèi)容和讀寫
Java FilterInputStream示例
Java內(nèi)存通道
Java路徑
Java令牌和字符串拆分
Java隨機訪問文件
Java文件樹
Java緩沖區(qū)讀寫
Java FileOutputStream
Java目錄事件
Java FilterOutputStream示例
Java DataOutputStream實例
FileDescriptor示例

Java文件所有者權(quán)限

在Java中,有三種方法可以管理文件所有者:

  • 使用Files.getOwner()Files.setOwner()方法。
  • 使用“owner”作為屬性名稱的Files.getAttribute()Files.setAttribute()方法。
  • 使用FileOwnerAttributeView。

需要使用UserPrincipalGroupPrincipal接口來管理文件的所有者。文件的所有者可以是用戶或組。UserPrincipal表示用戶,GroupPrincipal表示組。
當(dāng)讀取文件的所有者時,得到一個UserPrincipal的實例。調(diào)用UserPrincipal對象上的getName()方法以獲取用戶的名稱。

要設(shè)置文件的所有者,請從用戶名獲取UserPrincipal的對象。

要從文件系統(tǒng)獲取UserPrincipal,請使用UserPrincipalLookupService類的實例,可以使用FileSystem類的getUserPrincipalLookupService()方法獲取該實例。

以下代碼為用戶ID為myName的用戶獲取一個UserPrincipal對象:

FileSystem fs  = FileSystems.getDefault();
UserPrincipalLookupService upls  = fs.getUserPrincipalLookupService();

UserPrincipal user = upls.lookupPrincipalByName("myName"); 
System.out.format("User principal name is %s%n", user.getName());

以下代碼顯示如何使用FileOwnerAttributeView更改文件的所有者。

import java.io.IOException;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.FileOwnerAttributeView;
import java.nio.file.attribute.UserPrincipal;
import java.nio.file.attribute.UserPrincipalLookupService;

public class Main {
  public static void main(String[] args) throws Exception {

      Path path = Paths.get("C:\\Java_Dev\\test1.txt");

      FileOwnerAttributeView foav = Files.getFileAttributeView(path,
          FileOwnerAttributeView.class);

      UserPrincipal owner = foav.getOwner();
      System.out.format("Original owner  of  %s  is %s%n", path,
          owner.getName());

      FileSystem fs = FileSystems.getDefault();
      UserPrincipalLookupService upls = fs.getUserPrincipalLookupService();

      UserPrincipal newOwner = upls.lookupPrincipalByName("brice");
      foav.setOwner(newOwner);

      UserPrincipal changedOwner = foav.getOwner();
      System.out.format("New owner  of  %s  is %s%n", path,
          changedOwner.getName());

  }
}

以下代碼使用Files.setOwner()方法更新在Windows上使用路徑C:\Java_Dev\test1.txt標(biāo)識的文件的所有者:

UserPrincipal owner  = get   the   owner;
Path  path   = Paths.get("C:\\Java_Dev\\test1.txt"); 
Files.setOwner(path,  owner);

ACL文件權(quán)限

Microsoft Windows上支持ACL類型文件屬性。ACL由訪問控制條目的有序列表組成。每個條目由一個UserPrincipal,訪問類型和對對象的訪問級別組成。AclEntry類表示ACL中的條目。

使用AclFileAttributeViewgetAcl()setAcl()方法獲取和設(shè)置文件的AclEntry列表。

以下代碼獲取名為 C:\Java_Dev\test1.txt 的文件的ACL條目列表:

Path  path   = Paths.get("C:\\Java_Dev\\test1.txt"); 
AclFileAttributeView view  = Files.getFileAttributeView(path,  AclFileAttributeView.class); 
List<AclEntry> aclEntries = view.getAcl();

AclEntry類可以讀取ACL條目的各種屬性。 其principal()方法返回UserPrincipal以標(biāo)識用戶或組。AclEntrypermissions()返回一組AclEntryPermission對象以標(biāo)識權(quán)限。
AclEntrytype()方法返回類型AclEntryType的枚舉常量,例如ALARM,ALLOW,AUDIT``和DENY,用于指示訪問類型。
AclEntryflags()方法返回一組AclEntryFlag枚舉常量,其中包含ACL條目的繼承標(biāo)志。

以下代碼顯示如何讀取文件 C:\Java_Dev\test1.txt 的ACL條目。

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.AclEntry;
import java.nio.file.attribute.AclEntryPermission;
import java.nio.file.attribute.AclFileAttributeView;
import java.util.List;
import java.util.Set;

public class Main {
  public static void main(String[] args) throws Exception {
    Path path = Paths.get("C:\\Java_Dev\\test1.txt");
    AclFileAttributeView aclView = Files.getFileAttributeView(path,
        AclFileAttributeView.class);
    if (aclView == null) {
      System.out.format("ACL view  is not  supported.%n");
      return;
    }
    List<AclEntry> aclEntries = aclView.getAcl();
    for (AclEntry entry : aclEntries) {
      System.out.format("Principal: %s%n", entry.principal());
      System.out.format("Type: %s%n", entry.type());
      System.out.format("Permissions are:%n");

      Set<AclEntryPermission> permissions = entry.permissions();
      for (AclEntryPermission p : permissions) {
        System.out.format("%s %n", p);
      }

    }

  }
}

示例

以下代碼顯示如何為名為brice的用戶添加新的ACL條目。 它在 C:\Java_Dev\test1.txt 文件中為用戶添加DATA_READDATA_ WRITE權(quán)限。

import static java.nio.file.attribute.AclEntryPermission.READ_DATA;
import static java.nio.file.attribute.AclEntryPermission.WRITE_DATA;

import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.AclEntry;
import java.nio.file.attribute.AclEntryPermission;
import java.nio.file.attribute.AclEntryType;
import java.nio.file.attribute.AclFileAttributeView;
import java.nio.file.attribute.UserPrincipal;
import java.util.EnumSet;
import java.util.List;
import java.util.Set;

public class Main {
  public static void main(String[] args) throws Exception {
    Path path = Paths.get("C:\\Java_Dev\\test1.txt");

    AclFileAttributeView aclView = Files.getFileAttributeView(path,
        AclFileAttributeView.class);
    if (aclView == null) {
      System.out.format("ACL view  is not  supported.%n");
      return;
    }
    UserPrincipal bRiceUser = FileSystems.getDefault()
        .getUserPrincipalLookupService().lookupPrincipalByName("brice");

    Set<AclEntryPermission> permissions = EnumSet.of(READ_DATA, WRITE_DATA);

    AclEntry.Builder builder = AclEntry.newBuilder();
    builder.setPrincipal(bRiceUser);
    builder.setType(AclEntryType.ALLOW);
    builder.setPermissions(permissions);
    AclEntry newEntry = builder.build();

    List<AclEntry> aclEntries = aclView.getAcl();

    aclEntries.add(newEntry);

    aclView.setAcl(aclEntries);
  }
}

POSIX文件權(quán)限

UNIX支持POSIX標(biāo)準文件屬性。POSIX文件權(quán)限由九個組件組成:

  • 三個為所有者
  • 三個為所在用戶組
  • 三個為其它

這三種類型的權(quán)限分別是:讀,寫和執(zhí)行。

典型POSIX的字符串形式文件權(quán)限看起來像“rw-rw----”,它表示所有者和組的讀取和寫入權(quán)限。PosixFilePermission枚舉類型定義九個常量,每個權(quán)限組件一個。九個常量命名為X_Y,其中X是OWNER,GROUPOTHERS,YREAD,WRITEEXECUTE。

PosixFilePermissions是一個實用程序類,它將文件的POSIX權(quán)限從一種形式轉(zhuǎn)換為另一種形式的方法。
它的toString()方法將一組PosixFilePermission枚舉常量轉(zhuǎn)換為rwxrwxrwx形式的字符串。它的fromString()方法將rwxrwxrwx形式的字符串中的POSIX文件權(quán)限轉(zhuǎn)換為一組PosixFilePermission枚舉常量。它的asFileAttribute()方法將一組PosixFilePermission枚舉常量轉(zhuǎn)換為FileAttribute對象。

以下代碼是在默認目錄中一個名稱為test的文件夾的rwxrwxrwx格式讀取和打印POSIX文件權(quán)限:

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
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.util.Set;

public class Main {
  public static void main(String[] argv)throws Exception {
    Path path = Paths.get("test");
    PosixFileAttributeView posixView = Files.getFileAttributeView(path,
        PosixFileAttributeView.class);
    PosixFileAttributes attribs = posixView.readAttributes();
    Set<PosixFilePermission> permissions = attribs.permissions();
    // Convert the file permissions into the rwxrwxrwx string form
    String rwxFormPermissions = PosixFilePermissions.toString(permissions);
    // Print the permissions
    System.out.println(rwxFormPermissions);
  }
}

要更新POSIX文件權(quán)限,請調(diào)用PosixFileAttributeViewsetPermissions()方法,將PosixFilePermission枚舉常量的Set作為參數(shù)傳遞。

以下代碼顯示如何設(shè)置POSIX文件權(quán)限:

String rwxFormPermissions = "rw-r-----";
Set<PosixFilePermission> permissions = PosixFilePermissions.fromString(rwxFormPermissions);

posixView.setPermissions(permissions);

以下代碼直接創(chuàng)建一組PosixFilePermission枚舉常量,并將其設(shè)置為文件權(quán)限。

Set<PosixFilePermission> permissions = EnumSet.of(OWNER_READ,  OWNER_WRITE, GROUP_READ);
posixView.setPermissions(permissions);

以下代碼演示如何在類似UNIX的平臺上讀取和更新名為test的文件的POSIX文件權(quán)限(注:最好在Linux/Unix操作系統(tǒng)上執(zhí)行)。

import static java.nio.file.attribute.PosixFilePermission.GROUP_READ;
import static java.nio.file.attribute.PosixFilePermission.OWNER_READ;
import static java.nio.file.attribute.PosixFilePermission.OWNER_WRITE;

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
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.util.EnumSet;
import java.util.Set;

public class Main {
  public static void main(String[] args) throws Exception {
    Path path = Paths.get("test");
    PosixFileAttributeView posixView = Files.getFileAttributeView(path,
        PosixFileAttributeView.class);
    if (posixView == null) {
      System.out.format("POSIX attribute view  is not  supported%n.");
      return;
    }
    readPermissions(posixView);
    updatePermissions(posixView);
  }

  public static void readPermissions(PosixFileAttributeView posixView)
      throws Exception {
    PosixFileAttributes attribs;
    attribs = posixView.readAttributes();
    Set<PosixFilePermission> permissions = attribs.permissions();
    // Convert the set of posix file permissions into rwxrwxrwx form
    String rwxFormPermissions = PosixFilePermissions.toString(permissions);
    System.out.println(rwxFormPermissions);
  }
  public static void updatePermissions(PosixFileAttributeView posixView)
      throws Exception {
    Set<PosixFilePermission> permissions = EnumSet.of(OWNER_READ, OWNER_WRITE,
        GROUP_READ);
    posixView.setPermissions(permissions);
    System.out.println("Permissions set successfully.");
  }
}

上面的代碼生成以下結(jié)果。

POSIX attribute view  is not  supported
.

上一篇:Java異步I/O下一篇:Java Reader/Writer