Java创建指定权限目录异常:权限被重置为默认值
Java创建目录权限被重置的问题解决
你尝试用Java代码创建权限为rwxrw-rw-(数字权限766)的目录,但实际生成的目录权限却是drwxr--r--(744)。修改系统umask为000后,终端直接创建目录能得到正确权限,但Java程序创建的目录权限仍无变化,只有不给组和其他用户设置写权限时操作才正常。
你的代码:
Path path = Paths.get(dir); Set<PosixFilePermission> perms = PosixFilePermissions.fromString("rwxrw-rw-"); System.out.println("Permissions are " + PosixFilePermissions.asFileAttribute(perms).value()); Files.createDirectories(path, PosixFilePermissions.asFileAttribute(perms));
实际生成的目录权限:
drwxr--r-- 3 user staff 96 Apr 18 18:16 testing
问题原因
核心问题出在Files.createDirectories的权限处理逻辑上:它会把你指定的权限和当前Java进程的umask做运算,最终实际生效的权限是指定权限减去umask屏蔽的权限。
你的umask默认是022,这个配置会屏蔽组和其他用户的写权限。所以哪怕你指定了rwxrw-rw-(766),经过umask过滤后,组和其他的写权限会被移除,变成rwxr--r--(744)。
你在终端修改umask为000,但Java进程并没有继承这个设置——终端的umask是当前shell进程的配置,IDE或其他方式启动的Java程序是独立进程,不会自动同步shell的umask,所以Java进程依然使用默认的022,权限还是会被过滤。
解决方案
最可靠的方式是先创建目录,再显式设置权限,绕过umask的影响:
Path path = Paths.get(dir); // 先创建目录(使用默认权限即可) Files.createDirectories(path); // 单独设置目标权限,此操作不受umask影响 Set<PosixFilePermission> perms = PosixFilePermissions.fromString("rwxrw-rw-"); Files.setPosixFilePermissions(path, perms);
如果非要通过createDirectories一步到位,需要确保Java进程的umask是000:
- 在终端中先设置umask,再启动Java程序:
umask 000 && java YourMainClass - 若用IDE运行,可修改IDE的启动脚本,添加
umask 000步骤后再启动Java进程(不同IDE配置方式不同,比如IntelliJ可在运行配置的「Before launch」中添加执行shell脚本的操作)。
验证
修改代码后重新运行,查看目录权限应该会变成drwxrw-rw-,与预期一致。
内容的提问来源于stack exchange,提问作者Stan
相关产品推荐
相关产品推荐

