2017-03-01 35 views
0

我需要ceate文件並設置權限(-rwxrw -r),父目錄的權限是(drwxrwxr--)。問題是寫入權限是 未在創建的文件中設置。運行此應用程序的用戶是父目錄的所有者。爲什麼具有權限的Java Files.createFile無法正常工作?

下面是我的測試類,提出了同樣的問題。當我運行這個程序時,通過類設置權限(-rwxrw-rw-)生成的文件的權限是(-rwxr - r--)。爲什麼沒有設置寫權限 ,我沒有看到任何異常?

有什麼想法?

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); 

} 

} 
+0

btw最好使用'EnumSet'而不是'HashSet'。 –

回答

1

事實證明,原因是我的操作系統具有的umask爲0027(U = RWX,G = RX,O =),這意味着應用程序沒有方式爲 設置其他羣組的權限。

0

Files.createFile(file.toPath(),attr);

在上面的行中,而不是使用Files.createFile 使用file.createNewFile(),如果它返回true,則創建該文件。

0

我相信這裏的漁獲

該文件的存在,並創造新的 文件,如果它不存在,是一個單一的操作,是原子與 對於所有其他的檢查文件系統活動可能會影響 目錄。

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