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

对于 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 属性视图支持以下属性名:

[list]
[*]group
[*]permissions
[/list]

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

[b][size=x-large]POSIX 文件权限[/size][/b]

调用 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 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);
}


[b][size=x-large]POSIX 组拥有者[/size][/b]

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() 方法来操作文件所有者。

文章来源:[url]http://www.aptusource.org/2014/03/nio-2-posix-view/[/url]

你可能感兴趣的:(Java,NIO.2)