在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
.