商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > 怎么通过 Files.setPosixFilePermissions() 在 Linux 环境下精确修改文件的读写执行权限位

怎么通过 Files.setPosixFilePermissions() 在 Linux 环境下精确修改文件的读写执行权限位

  发布于2026-07-06 阅读(0)

扫一扫,手机访问

在 Linux 或 macOS 这类 POSIX 兼容系统上,Ja va 的 Files.setPosixFilePermissions() 是个很实用的工具。说白了,它就是 Ja va NIO.2 专门用来设置文件那九个基础权限位的——owner、group、others 各自的读、写、执行。它不跟你搞什么八进制数字(比如 755),而是让你用 Set 枚举来挨个指定,这样语义更清晰,也不容易搞错。

怎么通过 Files.setPosixFilePermissions() 在 Linux 环境下精确修改文件的读写执行权限位

先来理解一下哪些枚举值可用。Ja va 把九个权限位拆成了三组,每组三个,分别对应读、写、执行:

  • OWNER_READu+r(用户读)
  • OWNER_WRITEu+w(用户写)
  • OWNER_EXECUTEu+x(用户执行)
  • GROUP_READg+r(组读)
  • GROUP_WRITEg+w(组写)
  • GROUP_EXECUTEg+x(组执行)
  • OTHERS_READo+r(其他用户读)
  • OTHERS_WRITEo+w(其他用户写)
  • OTHERS_EXECUTEo+x(其他用户执行)

需要特别留意的是,这里只覆盖了基础九位权限——粘滞位、setuid、setgid 这些高级玩意儿,setPosixFilePermissions() 是不管的。

如何把八进制权限(比如 755)转成枚举集合

Ja va 并没有提供内置的转换工具,所以需要手动映射。举个例子,755 这个权限,拆开来看:

  • owner: rwxOWNER_READ | OWNER_WRITE | OWNER_EXECUTE
  • group: r-xGROUP_READ | GROUP_EXECUTE
  • others: r-xOTHERS_READ | OTHERS_EXECUTE

写个辅助方法就能搞定,逻辑并不复杂:

public static Set fromOctal(int octal) {
    Set perms = EnumSet.noneOf(PosixFilePermission.class);
    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;
}

调用时就这么写:Files.setPosixFilePermissions(path, fromOctal(0755));。注意八进制数字前面的 0 不能省——不然 Ja va 会当成十进制。

更推荐的做法:直接使用枚举集合

说实话,显式声明权限比数字更直观,也能避免歧义。比如你想设置 -rwxr-x---(即 750),代码是:

Set perms = EnumSet.of(
    PosixFilePermission.OWNER_READ,
    PosixFilePermission.OWNER_WRITE,
    PosixFilePermission.OWNER_EXECUTE,
    PosixFilePermission.GROUP_READ,
    PosixFilePermission.GROUP_EXECUTE);
Files.setPosixFilePermissions(path, perms);

这样看代码的人一眼就能读明白,后期维护也省心。

几个容易踩的坑

  • 目标文件必须已经存在,而且 JVM 进程得有权限去改它的属性——一般来说你必须是文件所有者或者 root。
  • 如果文件系统不支持 POSIX(比如挂载的 FAT32 或 NTFS 分区),调用时会直接抛出 UnsupportedOperationException,这点要心里有数。
  • 这个方法只改权限位,不改文件的所有者和所属组。想改属主,得另用 Files.setOwner()Files.setAttribute("unix:group", ...)
  • 符号链接本身的权限可以设置,但多数 Linux 系统会忽略 symlink 的权限位——实际上生效的是目标文件的权限。
  • 执行权限对目录意味着“可以进入(cd)”,对普通文件才表示“可以运行”。可别弄混了。
本文转载于:https://www.php.cn/faq/2441864.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注