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

先来理解一下哪些枚举值可用。Ja va 把九个权限位拆成了三组,每组三个,分别对应读、写、执行:
u+r(用户读)u+w(用户写)u+x(用户执行)g+r(组读)g+w(组写)g+x(组执行)o+r(其他用户读)o+w(其他用户写)o+x(其他用户执行)需要特别留意的是,这里只覆盖了基础九位权限——粘滞位、setuid、setgid 这些高级玩意儿,setPosixFilePermissions() 是不管的。
Ja va 并没有提供内置的转换工具,所以需要手动映射。举个例子,755 这个权限,拆开来看:
rwx → OWNER_READ | OWNER_WRITE | OWNER_EXECUTEr-x → GROUP_READ | GROUP_EXECUTEr-x → OTHERS_READ | OTHERS_EXECUTE写个辅助方法就能搞定,逻辑并不复杂:
public static SetfromOctal(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),代码是:
Setperms = EnumSet.of( PosixFilePermission.OWNER_READ, PosixFilePermission.OWNER_WRITE, PosixFilePermission.OWNER_EXECUTE, PosixFilePermission.GROUP_READ, PosixFilePermission.GROUP_EXECUTE); Files.setPosixFilePermissions(path, perms);
这样看代码的人一眼就能读明白,后期维护也省心。
UnsupportedOperationException,这点要心里有数。Files.setOwner() 和 Files.setAttribute("unix:group", ...)。