Java文件所有者权限是指文件的拥有者可以对该文件进行的操作权限。它是一种访问控制,用于确定哪些用户可以访问和修改文件。
在 Java 中,文件所有者权限可以通过 java.io.File 类的 setReadable()、setWritable() 和 setExecutable() 方法来设置。这些方法允许你为文件授予读、写和执行权限,并根据你的需要为不同的用户组或用户赋予不同的权限。
// 赋予读写执行权限 file.setReadable(true); file.setWritable(true); file.setExecutable(true);
此外,Java 还允许你使用 java.nio.file.Files 类中的 setPosixFilePermissions() 方法为文件授予 POSIX 权限。POSIX 权限是一种特定的 UNIX 权限,允许你根据不同的用户组和用户分别为文件授予读、写和执行权限。
// 赋予读写执行权限 Set<PosixFilePermission> perms = new HashSet<PosixFilePermission>(); perms.add(PosixFilePermission.OWNER_READ); perms.add(PosixFilePermission.OWNER_WRITE); perms.add(PosixFilePermission.OWNER_EXECUTE); Files.setPosixFilePermissions(path, perms);
总之,Java 提供了多种方式来为文件授予不同的所有者权限:通过 File 类中的 setReadable()、setWritable() 和 setExecutable() 方法;通过 Files 类中的 setPosixFilePermissions() 方法。使用这些方法可以帮助你有效地确保 Java 应用程序中文件安全性。
有三种方法可以管理文件所有者:
我们需要使用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_Devtest1.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_Devtest1.txt标识的文件的所有者:
UserPrincipal owner = get the owner; Path path = Paths.get("C:Java_Devtest1.txt"); Files.setOwner(path, owner);
Microsoft Windows上支持ACL类型文件属性。
ACL由访问控制条目的有序列表组成。每个条目由一个UserPrincipal,访问类型和对对象的访问级别组成。
AclEntry类表示ACL中的条目。
使用AclFileAttributeView的getAcl()和setAcl()方法获取和设置文件的AclEntry列表。
以下代码获取名为C:Java_Devtest1.txt的文件的ACL条目列表:
Path path = Paths.get("C:Java_Devtest1.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_Devtest1.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_Devtest1.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_Devtest1.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_Devtest1.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文件权限转换为一组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."); } }
上面的代码生成以下结果。
Java数据类型教程 -Java boolean数据类型布尔数据类型只有两个有效值:true和false。这两个值称为布尔值字面量。我们可以使用布尔...
Java设计模式 - 解释器模式我们通常使用解释器模式来评估语言语法或表达。这种类型的模式是行为模式之一。例子interface Express...
Java设计模式 - 空对象模式在空对象模式中,创建一个无业务对象,包括 null 对象。我们使用无业务对象来替换空指针检查。我们称...
Java面向对象设计 -Java内部类成员内部类可以访问其所有实例成员,实例字段和其封闭类的实例方法。class Outer {private int val...
Java面向对象的设计 -Java继承隐藏方法隐藏类从其超类继承所有非私有静态方法。重定义类中继承的静态方法称为方法隐藏。子类中的...