Files.createFile() 支持通过PosixFilePermissions一次性设置POSIX基础权限(如"rw-------"对应0600),仅适用于Linux/macOS等类Unix系统;Windows上仅支持隐藏、只读等粗粒度属性,ACL需用AclFileAttributeView单独配置。

在 Java 7+ 的 NIO.2 中,Files.createFile() 支持传入 FileAttribute> 参数,可用于在创建文件时**一次性设置基础权限(如 POSIX 权限)**,但要注意:它不能直接设置 Windows ACL 或高级安全策略,且受限于运行环境(如操作系统支持、JVM 权限、用户权限)。
明确适用场景和限制
该方式主要适用于类 Unix 系统(Linux/macOS),通过 PosixFilePermissions 设置 owner/group/others 的读写执行位(rwx)。Windows 上仅部分有效(如隐藏、只读),ACL 需用 AclFileAttributeView 单独操作,且需管理员权限或 UAC 提升。
- 不跨平台通用:POSIX 权限在 Windows 上被忽略或映射为粗粒度属性
- 创建时生效:仅对新文件起作用;已有文件需用
Files.setPosixFilePermissions() - 依赖底层支持:若 JVM 运行在无 POSIX 权限的文件系统(如 FAT32、某些网络挂载),会静默失败或抛
UnsupportedOperationException
使用 PosixFilePermissions 设置基础权限(推荐方式)
这是最常用、最便携的初级权限控制方法。核心是构造 PosixFilePermission 集合,并转为 FileAttribute:
Path path = Paths.get("secret.txt");
Set<posixfilepermission> perms = PosixFilePermissions.fromString("rw-------"); // owner only: read+write
FileAttribute<set>> attr = PosixFilePermissions.asFileAttribute(perms);
try {
Files.createFile(path, attr);
} catch (IOException e) {
// 权限不被支持、目标目录不可写、无权限创建等
e.printStackTrace();
}</set></posixfilepermission>
-
"rw-------"表示仅文件所有者可读写,等价于0600八进制 - "rwxr-x---"(750)、
"rw-r--r--"(644)、"rwx------"(700) - drwx------),即使文件权限宽松,外部用户也无法访问
Windows 下设置只读/隐藏等基本属性(有限但可用)
Windows 不支持 POSIX,但可通过 DosFileAttributes 设置 DOS 属性:
Path path = Paths.get("config.ini");
FileAttribute<object> attr =
new BasicFileAttributeView() {
@Override
public void setAttribute(String attribute, Object value) throws IOException {}
@Override
public Map<string object> readAttributes() throws IOException {
return Map.of("dos:readonly", true, "dos:hidden", true);
}
// 实际中更建议用 Files.setAttribute()
};
// 更实用的做法是创建后单独设置:
Files.createFile(path);
Files.setAttribute(path, "dos:readonly", true);
Files.setAttribute(path, "dos:hidden", true);</string></object>
-
dos:readonly对应 Windows “只读”属性,阻止常规修改 -
dos:hidden使文件在资源管理器默认不显示(需开启“显示隐藏文件”才可见) - 这些不是访问控制列表(ACL),无法限制特定用户,仅提供轻量级提示/防护
重要提醒:权限 ≠ 安全保障
初级文件权限只是纵深防御的第一层,不能替代应用层鉴权:
- 同一用户下的所有进程默认共享该文件权限,恶意程序仍可读取
- 若运行 JVM 的用户是 root/administrator,设再严的文件权限也无意义
- 敏感内容(如密码、密钥)建议加密存储,而非仅靠文件权限隔离
- 生产环境应配合 OS 级策略(如 Linux 的 SELinux/AppArmor、Windows 的组策略)增强控制










