对于 Unix 用户来说是个好消息!POSIX 视图扩展 Basic 视图并支持 Unix 及其它相关操作系统。POSIX 视图支持文件所有者、组拥有者、以及九个
访问权限。
基于 PosixFileAttributes 类,可以通过下面的方式得到 POSIX 属性:
class="java" name="code">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 属性视图支持以下属性名:
访问属性的通用结构是 [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/