在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);
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);
}
}
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
.