Java NIO.2中DosFileAttributes和DosFileAttributeView专用于Windows文件系统,提供对只读、隐藏、系统、归档四类布尔型DOS标志位的稳定读写,映射attrib命令语义,支持类型安全批量访问与原子设置,但不涉及ADS、EFS等NTFS高级元数据。
java nio.2 中的 dosfileattributes 和对应视图(dosfileattributeview)是专为 windows(及兼容 dos 语义的文件系统)设计的,用于读写 ntfs/fat 上四类经典 dos 属性:只读、隐藏、系统、归档。它不操作“变量属性”,而是操作**固定语义的布尔型文件标志位**——这些标志直接映射到 windows 的 attrib 命令所管理的状态。
能稳定读写的四个核心属性
在标准 JVM(Oracle/OpenJDK)Windows 实现中,以下属性可跨版本可靠访问,无需管理员权限:
-
dos:hidden:对应资源管理器中“隐藏”状态,
Files.getAttribute(path, "dos:hidden")返回Boolean;设为true等效于attrib +h -
dos:readonly:控制是否允许修改/删除,
isReadOnly()与attrib +r行为一致 -
dos:system:标识系统文件(如
bootmgr),影响部分系统工具处理逻辑,但单独设置对普通用户不可见性影响有限 -
dos:archive:备份软件用作变更标记,
isArchive()读取后可被Files.setAttribute(..., "dos:archive", false)清除
推荐的操作方式
优先使用类型安全的 readAttributes 方式获取批量值,避免字符串硬编码出错:
DosFileAttributes attrs = Files.readAttributes(path, DosFileAttributes.class); boolean hidden = attrs.isHidden(); boolean readOnly = attrs.isReadOnly(); // 修改需通过 DosFileAttributeView DosFileAttributeView view = Files.getFileAttributeView(path, DosFileAttributeView.class); view.setHidden(true); // 原子设置,比 setAttribute 更直观 view.setReadOnly(false);
若仅需单个属性,Files.getAttribute(path, "dos:hidden") 和 Files.setAttribute(path, "dos:hidden", true) 更简洁,支持 LinkOption.NOFOLLOW_LINKS 控制符号链接行为。
关键限制必须清楚
这些 API 无法触及 NTFS 真正的“隐藏机制”,不是功能缺陷,而是设计边界:
-
不支持备用数据流(ADS):如
file.txt:secret完全不可见,Files.exists(Paths.get("file.txt:secret"))恒返回false -
不反映 UI 可见性逻辑:即使
dos:hidden=true,若系统开启“显示隐藏的文件和文件夹”,该文件仍可见;NIO.2 不感知资源管理器设置 -
不提供 EFS、重解析点、对象 ID 等元数据:这些属于 NTFS 内部结构,需调用 Win32 API(如
GetFileInformationByHandleEx)或第三方库(如ntfsstreams)
验证是否生效的小技巧
写入后建议用系统命令交叉验证,避免 JVM 缓存或权限干扰:
- 执行
attrib C:\path\to\file.txt查看当前四字符标志(H/R/S/A) - 在资源管理器中确认文件是否出现在“隐藏项目”开启/关闭时的列表中
- 注意:某些 IDE 或编辑器会缓存文件属性,刷新项目或重启可能必要


















