欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[NIO.2] 第十五篇 属性视图之 POSIX View

程序员文章站 2022-04-28 17:28:27
...
对于 Unix 用户来说是个好消息!POSIX 视图扩展 Basic 视图并支持 Unix 及其它相关操作系统。POSIX 视图支持文件所有者、组拥有者、以及九个访问权限。
基于 PosixFileAttributes 类,可以通过下面的方式得到 POSIX 属性:

import java.io.IOException; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 
import java.nio.file.attribute.PosixFileAttributes; 
… 
PosixFileAttributes attr = null; 
Path path = Paths.get("/home/rafaelnadal/tournaments/2009/BNP.txt"); 
try { 
    attr = Files.readAttributes(path, PosixFileAttributes.class); 
} catch (IOException e) { 
    System.err.println(e); 
} 
 
 System.out.println("File owner: " + attr.owner().getName()); 
 System.out.println("File group: " + attr.group().getName()); 
 System.out.println("File permissions: " + attr.permissions().toString()); 


或者,也可以通过 Files.getFileAttributeView() 来获取 POSIX 属性:

import java.nio.file.attribute.PosixFileAttributeView; 
… 
try { 
    attr = Files.getFileAttributeView(path,  
                  PosixFileAttributeView.class).readAttributes(); 
} catch (IOException e) { 
    System.err.println(e); 
} 


Posix 属性视图支持以下属性名:

  • group
  • permissions


访问属性的通用结构是 [view-name:]attribute-name,在这里 view-name 是 posix。

POSIX 文件权限

调用 permissions() 方法会返回 PosixFilePermission 对象列表。PosixFilePermissions 是一个文件权限的帮助类,它有一个比较有用的方法是 asFileAttribute(),这个方法接受一个 Set 类型的权限列表,然后可以将返回值传给 Path.createFile() 方法或者 Path.createDirectory() 方法。这可以用于创建一个新文件,并让新文件和已有文件具有相同权限的时候:

import java.io.IOException; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 
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.util.Set; 
… 
Path new_path = Paths.get("/home/rafaelnadal/tournaments/2009/new_BNP.txt"); 
FileAttribute<Set> posixattrs =   
                       PosixFilePermissions.asFileAttribute(attr.permissions()); 
try { 
    Files.createFile(new_path, posixattrs); 
} catch (IOException e) { 
    System.err.println(e); 
} 
Moreover, you can set a file’s permissions as a hard-coded string by calling the fromString() 
method: 
Set permissions = PosixFilePermissions.fromString("rw-r--r--"); 
try { 
    Files.setPosixFilePermissions(new_path, permissions); 
} catch (IOException e) { 
    System.err.println(e); 
} 


POSIX 组拥有者

Posix 属性视图中,组拥有者属性名称是 group。setGroup() 方法可以传入一个 GroupPrincipal 类型的参数来设置组拥有者,GroupPrincipal 继承自 UserPrincipal:

import java.io.IOException; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 
import java.nio.file.attribute.GroupPrincipal; 
import java.nio.file.attribute.PosixFileAttributeView; 
… 
Path path = Paths.get("/home/rafaelnadal/tournaments/2009/BNP.txt"); 
try { 
    GroupPrincipal group = path.getFileSystem(). 
               getUserPrincipalLookupService().lookupPrincipalByGroupName("apressteam"); 
    Files.getFileAttributeView(path, PosixFileAttributeView.class).setGroup(group); 
} catch (IOException e) { 
    System.err.println(e); 
} 


注意:在上面的例子中使用了名为“apressteam”的组,这在你的机器上可能不存在,因此你在运行上面的代码时会抛出 java.nio.file.attribute.UserPrincipalNotFoundException 异常,要想正常运行,你需要在你的机器上添加正确的组名(管理员组或其它适合权限的组)。

可以直接调用 Files.getAttribute() 来得到组拥有者:

import static java.nio.file.LinkOption.NOFOLLOW_LINKS; 
… 
try { 
    GroupPrincipal group = (GroupPrincipal) Files.getAttribute(path, "posix:group", 
                                                                       NOFOLLOW_LINKS); 
    System.out.println(group.getName()); 
} catch (IOException e) { 
    System.err.println(e); 
} 


注:因为 PosixFileAttributeView 继承了 FileOwnerAttributeView 接口,因此可以直接调用 getOwner() 和 setOwner() 方法来操作文件所有者。

文章来源:http://www.aptusource.org/2014/03/nio-2-posix-view/
相关标签: Java Java NIO.2