Java - 无法创建具有777权限的目录(而不是775)

xia*_*oss 6 java posix file-permissions nio file

我正在尝试使用公共写权限创建目录.为了简化我希望它拥有777权限的东西.这是我的代码:

private static FileAttribute<Set<PosixFilePermission>> DIR_PERMISSIONS;
static {
    Set<PosixFilePermission> perms = new HashSet<>();
    perms.add(PosixFilePermission.OWNER_WRITE);
    perms.add(PosixFilePermission.OWNER_READ);
    perms.add(PosixFilePermission.OWNER_EXECUTE);
    perms.add(PosixFilePermission.GROUP_WRITE);
    perms.add(PosixFilePermission.GROUP_READ);
    perms.add(PosixFilePermission.GROUP_EXECUTE);
    perms.add(PosixFilePermission.OTHERS_WRITE);
    perms.add(PosixFilePermission.OTHERS_READ);
    perms.add(PosixFilePermission.OTHERS_EXECUTE);
    DIR_PERMISSIONS = PosixFilePermissions.asFileAttribute(perms);
}

private Path ensurePath(LocalDate localDate) throws IOException {
    String year = String.valueOf(localDate.getYear());
    String month = String.format("%02d", localDate.getMonthValue());
    Path path = Paths.get(rootDirectory, year, month);
    return Files.createDirectories(path, DIR_PERMISSIONS);
}
Run Code Online (Sandbox Code Playgroud)

有了rootDirectory=/tmp/data这应该创建文件夹一样/tmp/data/2016/01,各有777权限.相反,文件夹具有775权限(drwxrwxr-x.),因此它们缺少公共写入.为什么这样工作?也许JVM需要特殊的参数才能设置这样的权限?我的系统是Fedora 24,app是标准的Spring Boot应用程序,由maven插件启动.

Jon*_*son 6

好吧,这让我很好奇,所以这里是:

\n\n

谷歌导致了这一点:/sf/answers/1789056321/“Java正在设置您寻求的权限,然后它被屏蔽掉。”)然后返回@OlivierGr的链接xc3\xa9goire 最初提供。乌马斯克是一位严厉的情妇。

\n\n

Spring Boot 与此行为无关。下面是一个简单的概念证明。我的默认 umask 是 0002。我的 /tmp 目录最初是空的。

\n\n
public class Test {\n    public static void main(String[] args) {\n        Set<PosixFilePermission> fullPermission = new HashSet<PosixFilePermission>();\n        fullPermission.add(PosixFilePermission.OWNER_EXECUTE);\n        fullPermission.add(PosixFilePermission.OWNER_READ);\n        fullPermission.add(PosixFilePermission.OWNER_WRITE);\n\n        fullPermission.add(PosixFilePermission.GROUP_EXECUTE);\n        fullPermission.add(PosixFilePermission.GROUP_READ);\n        fullPermission.add(PosixFilePermission.GROUP_WRITE);\n\n        fullPermission.add(PosixFilePermission.OTHERS_EXECUTE);\n        fullPermission.add(PosixFilePermission.OTHERS_READ);\n        fullPermission.add(PosixFilePermission.OTHERS_WRITE);\n\n        Path path = Paths.get("/tmp/data/", "01/26");\n        try {\n            Files.createDirectories(path, PosixFilePermissions.asFileAttribute(fullPermission));            \n            outputLS(path);         \n            Files.setPosixFilePermissions(path, fullPermission);            \n            outputLS(path);         \n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n    }\n\n    private static void outputLS(Path path) throws IOException {\n        System.out.println(new java.util.Scanner(Runtime.getRuntime().exec("ls -alt " + path.toAbsolutePath() + "/..").getInputStream()).useDelimiter("\\\\A").next());\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

产量:

\n\n
total 12\ndrwxrwxr-x 3 jsampson jsampson 4096 Jan 26 21:53 .\ndrwxrwxr-x 2 jsampson jsampson 4096 Jan 26 21:53 26\ndrwxrwxr-x 3 jsampson jsampson 4096 Jan 26 21:53 ..\n\ntotal 12\ndrwxrwxr-x 3 jsampson jsampson 4096 Jan 26 21:53 .\ndrwxrwxrwx 2 jsampson jsampson 4096 Jan 26 21:53 26\ndrwxrwxr-x 3 jsampson jsampson 4096 Jan 26 21:53 ..\n
Run Code Online (Sandbox Code Playgroud)\n\n

umask只是负责所有文件/目录创建权限。创建后可以进行更改。

\n