一个访问控制列表(ACL)就是一组用来精确控制访问文件的权限列表。ACL 控制着文件所有者、权限、以及各种类型的文件标识。NIO.2 提供了 AclFileAttributeView 来支持 ACL。
使用 Files.getFileAttributeView() 获取 ACL
如果你没有见过 ACL 的内容,可以试试下面这段代码,使用了 Files.getFileAttributeView() 来获取 ACL,调用这个方法的返回值类型是 List<AclEntry>:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.AclEntry;
import java.nio.file.attribute.AclFileAttributeView;
import java.util.List;
…
List acllist = null;
Path path = Paths.get("C:/rafaelnadal/tournaments/2009", "BNP.txt");
AclFileAttributeView aclview = Files.getFileAttributeView(path, AclFileAttributeView.class);
try {
acllist = aclview.getAcl();
} catch (IOException e) {
System.err.println(e);
}
使用 Files.getAttribute() 获取 ACL
可以使用通用方法 getAttribute() 来获取 ACL:
import static java.nio.file.LinkOption.NOFOLLOW_LINKS;
…
List acllist = null;
Path path = Paths.get("C:/rafaelnadal/tournaments/2009", "BNP.txt");
try {
acllist = (List) Files.getAttribute(path, "acl:acl", NOFOLLOW_LINKS);
} catch (IOException e) {
System.err.println(e);
}
ACL 属性视图支持以下属性名称:
访问属性的通用结构是 [view-name:]attribute-name,在这里 view-name 是 acl。
读取 ACL 记录
前面的两个例子演示了如何获取 ACL 列表,它们的返回值都是存放 AclEntry 对象的 List。 AclEntry 对象对应 ACL 的一个入口。每个 AclEntry 对象由下面四部分组成:
- Type:入口的类型,可用值为: ALARM, ALLOW, AUDIT, 或 DENY。
- Principal:入口允许的身份,映射 UserPrincipal 类。
- Permissions:一组权限,映射 Set。
- Flags:一组标识,表示条目如何被继承和传播,映射 Set。
你可以用下面的代码遍历 ACL 列表,并打印出每个入口的详情,下面的例子打印出了前面例子中取得的 acllist:
for (AclEntry aclentry : acllist) {
System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++");
System.out.println("Principal: " + aclentry.principal().getName());
System.out.println("Type: " + aclentry.type().toString());
System.out.println("Permissions: " + aclentry.permissions().toString());
System.out.println("Flags: " + aclentry.flags().toString());
}
下面是在 Windows 7 上运行的结果
++++++++++++++++++++++++++++++++++++++++++++++++++++
Principal: BUILTIN\Administrators
Type: ALLOW
Permissions: [WRITE_OWNER, READ_ACL, EXECUTE, WRITE_NAMED_ATTRS, READ_ATTRIBUTES,
READ_NAMED_ATTRS, WRITE_DATA, WRITE_ACL, READ_DATA, WRITE_ATTRIBUTES, SYNCHRONIZE, DELETE,
DELETE_CHILD, APPEND_DATA]
Flags: []
++++++++++++++++++++++++++++++++++++++++++++++++++++
Principal: NT AUTHORITY\SYSTEM
Type: ALLOW
Permissions: [WRITE_OWNER, READ_ACL, EXECUTE, WRITE_NAMED_ATTRS, READ_ATTRIBUTES,
READ_NAMED_ATTRS, WRITE_DATA, WRITE_ACL, READ_DATA, WRITE_ATTRIBUTES, SYNCHRONIZE, DELETE,
DELETE_CHILD, APPEND_DATA]
Flags: []
++++++++++++++++++++++++++++++++++++++++++++++++++++
Principal: NT AUTHORITY\Authenticated Users
Type: ALLOW
Permissions: [READ_ACL, EXECUTE, READ_DATA, WRITE_ATTRIBUTES, WRITE_NAMED_ATTRS,
SYNCHRONIZE, DELETE, READ_ATTRIBUTES, READ_NAMED_ATTRS, WRITE_DATA, APPEND_DATA]
Flags: []
++++++++++++++++++++++++++++++++++++++++++++++++++++
Principal: BUILTIN\Users
Type: ALLOW
Permissions: [READ_ACL, EXECUTE, READ_DATA, SYNCHRONIZE, READ_ATTRIBUTES, READ_NAMED_ATTRS]
Flags: []
在 ACL 中添加新的入口
可以调用 AclEntry.Builder 的 build() 方法创建一个新的 ACL 入口。如果你要为某个用户添加新的访问权限,可以通过下面的步骤:
- 调用 FileSystem.getUserPrincipalLookupService() 方法查找用户。
- 获取 ACL View(前面已经介绍过)。
- 通过 AclEntry.Builder 对象创建新的入口。
- 读取 ACL(前面已经介绍过)。
- 插入新的入口(建议插入到 DENY 入口之前)。
- 调用 setAcl() 或 setAttribute() 重写 ACL。
遵照前面的步骤,下面的代码片段演示了如何为 apress 用户分配访问权限:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.AclEntry;
import java.nio.file.attribute.AclEntryPermission;
import java.nio.file.attribute.AclEntryType;
import java.nio.file.attribute.AclFileAttributeView;
import java.nio.file.attribute.UserPrincipal;
import java.util.List;
import static java.nio.file.LinkOption.NOFOLLOW_LINKS;
…
try {
//Lookup for the principal
UserPrincipal user = path.getFileSystem().getUserPrincipalLookupService()
//Get the ACL view
AclFileAttributeView view = Files.getFileAttributeView(path,
AclFileAttributeView.class);
//Create a new entry
AclEntry entry = AclEntry.newBuilder().setType(AclEntryType.ALLOW).
setPrincipal(user).setPermissions(AclEntryPermission.READ_DATA,
AclEntryPermission.APPEND_DATA).build();
//read ACL
List acl = view.getAcl();
//Insert the new entry
acl.add(0, entry);
//rewrite ACL
view.setAcl(acl);
//or, like this
//Files.setAttribute(path, "acl:acl", acl, NOFOLLOW_LINKS);
} catch (IOException e) {
System.err.println(e);
}
注意:上面的例子中使用到了用户 apress,如果你的机器上没有这个用户,会抛出 java.nio.file.attribute.UserPrincipalNotFoundException 异常。
上面的代码可以用来给已经存在的文件的 ACL 添加一个新的入口。也可以用于新创建文件的时候。
注意:因为 AclFileAttributeView 继承自 FileOwnerAttributeView,因此可以直接调用 getOwner() 和 setOwner() 方法。
文章来源:
http://www.aptusource.org/2014/03/nio-2-acl-view/
分享到:
相关推荐
Java I/O, NIO, and NIO.2 is a power-packed book that accelerates your mastery of Java's various I/O APIs. In this book, you'll learn about classic I/O APIs (File, RandomAccessFile, the stream classes ...
通道是NIO中的核心概念之一,它提供了从一个数据源(如文件、套接字)到另一个数据源的数据传输路径。Java NIO支持多种类型的通道,包括文件通道(FileChannel)、套接字通道(SocketChannel)和服务器套接字通道...
New I/O (NIO), and NIO.2 categories. You learn what each category offers in terms of its capabilities, and you also learn about concepts such as paths and Direct Memory Access. Chapters 2 through 5 ...
Java IO、NIO以及NIO.2是Java中用于处理输入/输出操作的三种主要机制。本书《Java IO, NIO and NIO.2》旨在深入浅出地介绍这些机制,同时书中内容均为英文。接下来将详细介绍这些知识点。 **Java IO** Java IO是...
根据提供的文件信息,“Pro Java 7 NIO.2.pdf”由Anghel Leonard于2011年编写,主要介绍了Java 7中的新输入/输出(NIO)API,特别是NIO.2(JSR 203)所带来的增强功能。这本书通过一系列章节详细讲解了如何使用NIO.2...
本篇我们将深入探讨NIO.2中的几个关键概念和类,包括`Files`, `Path`, `FileAttributes`, `DirectoryWatcher`以及`FileVisitor`。这些组件极大地增强了Java对操作系统文件系统的访问能力。 首先,`Path`接口是NIO.2...
java nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava ...
Java I/O, NIO, 和 NIO.2 是Java平台中处理输入/输出操作的核心组件,对于任何Java开发者来说,理解和掌握这些概念至关重要。本文将深入探讨这些技术,旨在提供一个全面而详尽的概述。 Java I/O(Input/Output)是...
`Pro Java 7 NIO.2`这本书由Anghel Leonard著,深入探讨了Java NIO.2 API,这是Java 7引入的进一步扩展,包括: 1. **文件系统API增强**:新增了AsynchronousFileChannel,支持异步文件操作,可以在后台线程中执行...
Java NIO.pdf nio教程 Java NIO.pdf nio教程 java nio
缓冲区则用于存储和传输数据,它是NIO的关键组件,具有容量、位置、限制等属性,并支持多种操作,如读写、反转、清除等。选择器允许单个线程同时监控多个通道,当某个通道准备进行读写操作时,选择器会通知我们,...
This book covers all the important aspects involved in developing NIO.2-based applications. It provides clear instructions for getting the most out of NIO.2 and offers many exercises and case studies ...
Java NIO(New Input/Output)是Java标准库中提供的一种I/O模型,与传统的BIO( Blocking I/O)相比,NIO具有更好的性能和更高的灵活性。NIO的核心组件包括通道(Channel)、缓冲区(Buffer)和选择器(Selector)。...
Pro Java 7 NIO.2 – PDF Books
【java.nio.file库详解】 Java 早期版本的文件I/O操作功能相对有限,存在几个显著问题:不支持现代文件系统特性、API设计复杂且冗长、处理大文件和并发性能不足。为了解决这些问题,Java引入了`java.nio.file`库,...
蔚来(NIO.US)新车上市,蔚来可期 蔚来(NIO.US)是一家中国的新能源汽车制造商,专注于生产高性能的电动汽车。 公司的目标是成为中国最大的新能源汽车品牌,并且跻身全球汽车行业的前列。 蔚来2025年目标价45.5...