Java文件所有者權限
在Java中,有三種方法可以管理文件所有者:
- 使用
Files.getOwner()
和Files.setOwner()
方法。 - 使用「
owner
」作爲屬性名稱的Files.getAttribute()
和Files.setAttribute()
方法。 - 使用
FileOwnerAttributeView
。
需要使用UserPrincipal
和GroupPrincipal
接口來管理文件的所有者。文件的所有者可以是用戶或組。UserPrincipal
表示用戶,GroupPrincipal
表示組。
當讀取文件的所有者時,得到一個UserPrincipal
的實例。調用UserPrincipal
對象上的getName()
方法以獲取用戶的名稱。
要設置文件的所有者,請從用戶名獲取UserPrincipal
的對象。
要從文件系統獲取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
標識的文件的所有者:
UserPrincipal owner = get the owner;
Path path = Paths.get("C:\\Java_Dev\\test1.txt");
Files.setOwner(path, owner);
ACL文件權限
Microsoft Windows上支持ACL類型文件屬性。ACL由訪問控制條目的有序列表組成。每個條目由一個UserPrincipal
,訪問類型和對對象的訪問級別組成。AclEntry
類表示ACL中的條目。
使用AclFileAttributeView
的getAcl()
和setAcl()
方法獲取和設置文件的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
以標識用戶或組。AclEntry
的permissions()
返回一組AclEntryPermission
對象以標識權限。AclEntry
的type()
方法返回類型AclEntryType
的枚舉常量,例如ALARM
,ALLOW
,AUDIT``和DENY
,用於指示訪問類型。AclEntry
的flags()
方法返回一組AclEntryFlag
枚舉常量,其中包含ACL條目的繼承標誌。
以下代碼顯示如何讀取文件 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_READ
和DATA_ WRITE
權限。
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文件權限
UNIX支持POSIX標準文件屬性。POSIX文件權限由九個組件組成:
- 三個爲所有者
- 三個爲所在用戶組
- 三個爲其它
這三種類型的權限分別是:讀,寫和執行。
典型POSIX的字符串形式文件權限看起來像「rw-rw----
」,它表示所有者和組的讀取和寫入權限。PosixFilePermission
枚舉類型定義九個常量,每個權限組件一個。九個常量命名爲X_Y
,其中X是OWNER
,GROUP
和OTHERS
,Y
是READ
,WRITE
和EXECUTE
。
PosixFilePermissions
是一個實用程序類,它將文件的POSIX權限從一種形式轉換爲另一種形式的方法。
它的toString()
方法將一組PosixFilePermission
枚舉常量轉換爲rwxrwxrwx
形式的字符串。它的fromString()
方法將rwxrwxrwx
形式的字符串中的POSIX文件權限轉換爲一組PosixFilePermissio
n枚舉常量。它的asFileAttribute()
方法將一組PosixFilePermission
枚舉常量轉換爲FileAttribute
對象。
以下代碼是在默認目錄中一個名稱爲test
的文件夾的rwxrwxrwx
格式讀取和打印POSIX文件權限:
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文件權限,請調用PosixFileAttributeView
的setPermissions()
方法,將PosixFilePermission
枚舉常量的Set
作爲參數傳遞。
以下代碼顯示如何設置POSIX文件權限:
String rwxFormPermissions = "rw-r-----";
Set<PosixFilePermission> permissions = PosixFilePermissions.fromString(rwxFormPermissions);
posixView.setPermissions(permissions);
以下代碼直接創建一組PosixFilePermission
枚舉常量,並將其設置爲文件權限。
Set<PosixFilePermission> permissions = EnumSet.of(OWNER_READ, OWNER_WRITE, GROUP_READ);
posixView.setPermissions(permissions);
以下代碼演示如何在類似UNIX的平臺上讀取和更新名爲test
的文件的POSIX文件權限(注:最好在Linux/Unix操作系統上執行)。
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.");
}
}
上面的代碼生成以下結果。
POSIX attribute view is not supported
.