files.setposixfilepermissions() 是 java nio.2 提供的用于在 posix 系统(如 linux/macos)上安全设置文件基础九位权限的方法,通过 posixfilepermission 枚举显式指定 owner/group/others 的读、写、执行权限,不支持粘滞位或 setuid/setgid,且要求文件存在、jvm 具备修改权限能力。

Files.setPosixFilePermissions() 是 Java NIO.2 提供的用于设置 POSIX 文件权限的方法,适用于 Linux、macOS 等支持 POSIX 权限的系统。它不直接操作八进制数字(如 755),而是通过 Set<posixfilepermission></posixfilepermission> 显式指定每个权限位,更安全、语义更清晰。
理解 PosixFilePermission 枚举值
Java 将九个权限位拆分为三组(owner/group/others),每组含 READ/WRITE/EXECUTE。对应关系如下:
-
OWNER_READ →
u+r(用户读) -
OWNER_WRITE →
u+w(用户写) -
OWNER_EXECUTE →
u+x(用户执行) -
GROUP_READ →
g+r(组读) -
GROUP_WRITE →
g+w(组写) -
GROUP_EXECUTE →
g+x(组执行) -
OTHERS_READ →
o+r(其他用户读) -
OTHERS_WRITE →
o+w(其他用户写) -
OTHERS_EXECUTE →
o+x(其他用户执行)
注意:没有单独的“粘滞位”(sticky bit)、setuid/setgid 支持 —— setPosixFilePermissions() 仅控制基础九位。
将八进制权限(如 755)转为 PosixFilePermission 集合
Java 不提供内置转换工具,需手动映射。例如,755 对应:
- owner:
rwx→OWNER_READ | OWNER_WRITE | OWNER_EXECUTE - group:
r-x→GROUP_READ | GROUP_EXECUTE - others:
r-x→OTHERS_READ | OTHERS_EXECUTE
可封装一个辅助方法:
public static Set<posixfilepermission> fromOctal(int octal) {
Set<posixfilepermission> perms = EnumSet.noneOf(PosixFilePermission.class);
// 从右往左取三位:others(0-7), group(0-7), owner(0-7)
int others = octal % 8;
int group = (octal / 8) % 8;
int owner = (octal / 64) % 8;
if ((owner & 4) != 0) perms.add(PosixFilePermission.OWNER_READ);
if ((owner & 2) != 0) perms.add(PosixFilePermission.OWNER_WRITE);
if ((owner & 1) != 0) perms.add(PosixFilePermission.OWNER_EXECUTE);
if ((group & 4) != 0) perms.add(PosixFilePermission.GROUP_READ);
if ((group & 2) != 0) perms.add(PosixFilePermission.GROUP_WRITE);
if ((group & 1) != 0) perms.add(PosixFilePermission.GROUP_EXECUTE);
if ((others & 4) != 0) perms.add(PosixFilePermission.OTHERS_READ);
if ((others & 2) != 0) perms.add(PosixFilePermission.OTHERS_WRITE);
if ((others & 1) != 0) perms.add(PosixFilePermission.OTHERS_EXECUTE);
return perms;
}
</posixfilepermission></posixfilepermission>
调用:Files.setPosixFilePermissions(path, fromOctal(0755));
直接使用枚举集合(推荐,更清晰)
避免数字歧义,建议显式声明权限。例如设置 -rwxr-x---(750):
Set<posixfilepermission> perms = EnumSet.of(
PosixFilePermission.OWNER_READ,
PosixFilePermission.OWNER_WRITE,
PosixFilePermission.OWNER_EXECUTE,
PosixFilePermission.GROUP_READ,
PosixFilePermission.GROUP_EXECUTE
);
Files.setPosixFilePermissions(path, perms);
</posixfilepermission>
这样逻辑一目了然,也便于代码审查和后期维护。
注意事项与常见问题
- 目标文件必须存在且 JVM 进程有权限修改其属性(通常需是文件所有者或 root)
- 若文件系统不支持 POSIX(如某些挂载的 FAT32/NTFS),会抛
UnsupportedOperationException - 该方法**不改变文件所有者或所属组**,只改权限位;如需改属主,用
Files.setOwner()和Files.setAttribute("unix:group", ...) - 符号链接本身权限可设,但多数 Linux 默认忽略 symlink 的权限位(实际生效的是目标文件权限)
- 执行权限对目录意味着“可进入(cd)”,对普通文件才意味着“可运行”











