java中推荐使用java.nio.file包操作文件属性:用files.getlastmodifiedtime()和setlastmodifiedtime()获取/设置纳秒级修改时间,用posixfileattributeview读写posix权限(linux/macos),windows则用dosfileattributeview处理只读等基础属性,所有操作需捕获ioexception。

Java 中获取和修改文件的最后修改时间与权限属性,推荐直接使用 java.nio.file 包(即 NIO.2),它比传统 java.io.File 更高效、更精确,且原生支持 POSIX 权限、毫秒级时间戳等现代文件系统特性。
获取最后修改时间(毫秒级精度)
使用 Files.getLastModifiedTime() 可以直接读取文件的最后修改时间,返回 FileTime 对象,精度可达纳秒(取决于文件系统支持)。
- 避免用
File.lastModified(),它只返回毫秒级 long 值,且不抛出检查异常,容易忽略 I/O 错误 -
FileTime可无缝转换为Instant、ZonedDateTime或毫秒值,便于日志或业务计算 - 示例:
FileTime lastMod = Files.getLastModifiedTime(path);
long millis = lastMod.toMillis(); // 转毫秒
Instant instant = lastMod.toInstant(); // 转 Instant
修改最后修改时间(支持精确到纳秒)
调用 Files.setLastModifiedTime() 即可更新,传入 FileTime 实例。注意:部分文件系统(如 FAT32)仅支持 2 秒或 10 毫秒粒度,但 API 层仍按纳秒处理。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 不要用
File.setLastModified(long),它无法设置纳秒精度,且对只读文件可能静默失败 - 若需设为“当前时间”,推荐
FileTime.from(Instant.now()),语义清晰且时区安全 - 示例:
Files.setLastModifiedTime(path, FileTime.from(Instant.now()));
读取与设置 POSIX 权限(Linux/macOS)
在支持 POSIX 的系统上,可通过 PosixFileAttributeView 获取和修改权限(如 rwx)、所有者、组等。
- 获取权限:
PosixFileAttributes attrs = Files.readAttributes(path, PosixFileAttributes.class);
Setperms = attrs.permissions(); - 设置权限(例如设为 -rw-r--r--):
SetnewPerms = PosixFilePermissions.fromString("rw-r--r--");
Files.setPosixFilePermissions(path, newPerms); - 注意:Windows 不支持 POSIX 权限,调用会抛
UnsupportedOperationException;可先用Files.isPosix()判断
处理 Windows ACL 或基础权限(跨平台兼容方案)
若需在 Windows 上控制访问控制列表(ACL)或简化权限(如只读/隐藏),应使用 AclFileAttributeView 或 DosFileAttributeView。
- 设为只读(Windows/macOS/Linux 都支持):
Files.setAttribute(path, "dos:readonly", true); - 获取隐藏属性:
Boolean hidden = (Boolean) Files.getAttribute(path, "dos:hidden"); - ACL 操作较复杂,建议仅在必要时使用
AclFileAttributeView,并捕获IOException和SecurityException
不复杂但容易忽略:所有 NIO.2 操作默认遵循文件系统的实际能力,务必捕获 IOException,并在多线程场景中注意路径对象不可变性——Path 是线程安全的,但文件状态本身不是原子的。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










