Java 文件所有者权限
Java IO教程 - 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以标识用户或组。
permissions()从AclEntry返回一组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文件权限由九个组件组成:
- three for the owner
- three for the group
- three for others
这三种类型的权限是读,写和执行。
字符串形式的典型POSIX文件权限看起来像“rw-rw ----",它具有所有者和组的读取和写入权限。
PosixFilePermission枚举类型定义九个常量,每个权限组件一个。
九个常数命名为X_Y,其中X是OWNER,GROUP和OTHERS,Y是READ,WRITE和EXECUTE。
PosixFilePermissions是一个实用程序类,它具有将文件的POSIX权限从一种形式转换为另一种形式的方法。
它的toString()方法将一组PosixFilePermission枚举常量转换为rwxrwxrwx形式的字符串。
它的fromString()方法将rwxrwxrwx形式的字符串中的POSIX文件权限转换为一组PosixFilePermission枚举常量。
它的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文件权限。
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."); } }
上面的代码生成以下结果。
更多建议: