为什么 Java Files.createFile 权限不能正常工作?

Why Java Files.createFile with permissions doesn't work correctly?

我需要创建文件并设置权限(-rwxrw-r),父目录的权限是(drwxrwxr--)。问题是写权限是 未在创建的文件中设置。 运行 此应用程序是父目录所有者的用户。

下面是我的测试 class,它存在同样的问题。当我运行这个程序时,生成文件的权限是(-rwxr--r--)虽然class设置权限(-rwxrw-rw-)。为什么没有设置写权限 我没有看到任何异常?

有什么想法吗?

import java.io.BufferedInputStream;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.attribute.FileAttribute;
import java.nio.file.attribute.PosixFileAttributes;
import java.nio.file.attribute.PosixFilePermission;
import java.nio.file.attribute.PosixFilePermissions;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import java.util.TimeZone;
import java.util.concurrent.TimeUnit;

public class TestPermission{

static String parentDir = "/tmp/test/";

static Set<PosixFilePermission> defaultPosixPermissions = null;
static {
    defaultPosixPermissions = new HashSet<>();
    defaultPosixPermissions.add(PosixFilePermission.OWNER_READ);
    defaultPosixPermissions.add(PosixFilePermission.OWNER_WRITE);
    defaultPosixPermissions.add(PosixFilePermission.OWNER_EXECUTE);
    defaultPosixPermissions.add(PosixFilePermission.GROUP_READ);
    defaultPosixPermissions.add(PosixFilePermission.GROUP_WRITE);
    //Others have read permission so that ftp user who doesn't belong to the group can fetch the file
    defaultPosixPermissions.add(PosixFilePermission.OTHERS_READ);
    defaultPosixPermissions.add(PosixFilePermission.OTHERS_WRITE);
}


public static void createFileWithPermission(String fileName) throws IOException{
   // File parentFolder = new File(parentDir);
   // PosixFileAttributes attrs = Files.readAttributes(parentFolder.toPath(), PosixFileAttributes.class);
   // System.out.format("parentfolder permissions: %s %s %s%n",
   //   attrs.owner().getName(),
   //   attrs.group().getName(),
   //   PosixFilePermissions.toString(attrs.permissions()));

   // FileAttribute<Set<PosixFilePermission>> attr =  PosixFilePermissions.asFileAttribute(attrs.permissions());
    FileAttribute<Set<PosixFilePermission>> attr =  PosixFilePermissions.asFileAttribute(defaultPosixPermissions);
    File file = new File(fileName);
    Files.createFile(file.toPath(), attr);
}

public static void main(String[] args) throws IOException{
    String fileName = parentDir + "testPermission_" + System.currentTimeMillis();
    createFileWithPermission(fileName);

}

}

Files.createFile(file.toPath(), 属性);

在上面的行中而不是使用 Files.createFile 使用 file.createNewFile() 如果它 returns true 则创建文件。

我相信这里的问题是

The check for the existence of the file and the creation of the new file if it does not exist are a single operation that is atomic with respect to all other filesystem activities that might affect the directory.

Class Files

所述

这可能是因为在创建文件后发生了 OS 操作。代码中的以下修改应该可以正常工作:

File file = new File(fileName);
Files.createFile(file.toPath(), attr);
Files.setPosixFilePermissions(file.toPath(), defaultPosixPermissions);  //Assure the permissions again after the file is created

原来是因为我的os有一个umask为0027(u=rwx,g=rx,o=)这意味着应用程序没有办法 为其他组设置权限。