有三種方法可以管理文件所有者:
我們需要使用UserPrincipal和GroupPrincipal接口來(lái)管理文件的所有者。
文件的所有者可以是用戶或組。
UserPrincipal表示用戶。GroupPrincipal表示組。
當(dāng)我們讀取文件的所有者時(shí),我們得到一個(gè)UserPrincipal的實(shí)例。在UserPrincipal對(duì)象上調(diào)用getName()方法以獲取用戶的名稱。
要設(shè)置文件的所有者,請(qǐng)從用戶名獲取UserPrincipal的對(duì)象。
要從文件系統(tǒng)獲取UserPrincipal,請(qǐng)使用UserPrincipalLookupService類的實(shí)例,我們可以使用FileSystem類的getUserPrincipalLookupService()方法獲取該實(shí)例。
以下代碼為用戶ID為myName的用戶獲取一個(gè)UserPrincipal對(duì)象:
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)識(shí)的文件的所有者:
UserPrincipal owner = get the owner; Path path = Paths.get("C:\\Java_Dev\\test1.txt"); Files.setOwner(path, owner);
Microsoft Windows上支持ACL類型文件屬性。
ACL由訪問(wèn)控制條目的有序列表組成。每個(gè)條目由一個(gè)UserPrincipal,訪問(wèn)類型和對(duì)對(duì)象的訪問(wèn)級(jí)別組成。
AclEntry類表示ACL中的條目。
使用AclFileAttributeView的getAcl()和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)識(shí)用戶或組。
permissions()從AclEntry返回一組AclEntryPermission對(duì)象以標(biāo)識(shí)權(quán)限。
來(lái)自AclEntry的type()方法返回類型AclEntryType的枚舉常量,例如ALARM,ALLOW,AUDIT和DENY,用于指示訪問(wèn)類型。
來(lái)自AclEntry的flags()方法返回一組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_READ和DATA_ 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); } }
UNIX支持POSIX標(biāo)準(zhǔn)文件屬性。POSIX文件權(quán)限由九個(gè)組件組成:
這三種類型的權(quán)限是讀,寫和執(zhí)行。
字符串形式的典型POSIX文件權(quán)限看起來(lái)像“rw-rw ----",它具有所有者和組的讀取和寫入權(quán)限。
PosixFilePermission枚舉類型定義九個(gè)常量,每個(gè)權(quán)限組件一個(gè)。
九個(gè)常數(shù)命名為X_Y,其中X是OWNER,GROUP和OTHERS,Y是READ,WRITE和EXECUTE。
PosixFilePermissions是一個(gè)實(shí)用程序類,它具有將文件的POSIX權(quán)限從一種形式轉(zhuǎn)換為另一種形式的方法。
它的toString()方法將一組PosixFilePermission枚舉常量轉(zhuǎn)換為rwxrwxrwx形式的字符串。
它的fromString()方法將rwxrwxrwx形式的字符串中的POSIX文件權(quán)限轉(zhuǎn)換為一組PosixFilePermission枚舉常量。
它的asFileAttribute()方法將一組PosixFilePermission枚舉常量轉(zhuǎn)換為FileAttribute對(duì)象。
以下代碼以默認(rèn)目錄中名為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)限,請(qǐng)調(diào)用PosixFileAttributeView的setPermissions()方法,將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的平臺(tái)上讀取和更新名為test的文件的POSIX文件權(quán)限。
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é)果。
更多建議: