[NIO.2] 第十五篇 属性视图之 POSIX View
程序员文章站
2022-04-28 17:28:27
...
对于 Unix 用户来说是个好消息!POSIX 视图扩展 Basic 视图并支持 Unix 及其它相关操作系统。POSIX 视图支持文件所有者、组拥有者、以及九个访问权限。
基于 PosixFileAttributes 类,可以通过下面的方式得到 POSIX 属性:
或者,也可以通过 Files.getFileAttributeView() 来获取 POSIX 属性:
Posix 属性视图支持以下属性名:
访问属性的通用结构是 [view-name:]attribute-name,在这里 view-name 是 posix。
POSIX 文件权限
调用 permissions() 方法会返回 PosixFilePermission 对象列表。PosixFilePermissions 是一个文件权限的帮助类,它有一个比较有用的方法是 asFileAttribute(),这个方法接受一个 Set 类型的权限列表,然后可以将返回值传给 Path.createFile() 方法或者 Path.createDirectory() 方法。这可以用于创建一个新文件,并让新文件和已有文件具有相同权限的时候:
POSIX 组拥有者
Posix 属性视图中,组拥有者属性名称是 group。setGroup() 方法可以传入一个 GroupPrincipal 类型的参数来设置组拥有者,GroupPrincipal 继承自 UserPrincipal:
注意:在上面的例子中使用了名为“apressteam”的组,这在你的机器上可能不存在,因此你在运行上面的代码时会抛出 java.nio.file.attribute.UserPrincipalNotFoundException 异常,要想正常运行,你需要在你的机器上添加正确的组名(管理员组或其它适合权限的组)。
可以直接调用 Files.getAttribute() 来得到组拥有者:
注:因为 PosixFileAttributeView 继承了 FileOwnerAttributeView 接口,因此可以直接调用 getOwner() 和 setOwner() 方法来操作文件所有者。
文章来源:http://www.aptusource.org/2014/03/nio-2-posix-view/
基于 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/