Java修改文件最后修改时间核心是File.setLastModified(long),需确保文件存在可写、时间非负,精度受文件系统限制;推荐用java.time转换时间戳,或改用NIO.2的Files.setLastModifiedTime更可靠。

Java 中修改文件的最后修改时间,核心是使用 File.setLastModified(long time) 方法。它不涉及读写文件内容,而是直接更新文件系统中记录的时间戳。操作简单但有几个关键点必须注意,否则容易返回 false 却不知原因。
用 File.setLastModified() 设置时间
这个方法接收一个毫秒级时间戳(自 1970-01-01 GMT 起),设置成功返回 true,失败返回 false。失败常见原因包括:文件不存在、无写权限、路径指向的是目录而非普通文件、或底层文件系统不支持毫秒级修改。
- 确保文件存在且可写:调用前建议先用
file.exists()和file.canWrite()检查 - 时间值不能为负:传入负数会抛出
IllegalArgumentException - 精度受限于文件系统:例如 FAT32 只保留到秒,传入的毫秒部分会被截断
获取并转换目标时间戳
要设成某个具体日期(比如“2023-01-01 10:00:00”),需先转成毫秒值。推荐用 java.time(Java 8+)避免过时的 SimpleDateFormat:
- 用
LocalDateTime.of(2023, 1, 1, 10, 0, 0)构造时间 - 转为带时区的
ZonedDateTime(如.atZone(ZoneId.systemDefault())) - 再调用
.toInstant().toEpochMilli()得到 long 值
若只需设为当前时间,直接用 System.currentTimeMillis() 最简洁可靠。
验证修改是否生效
设置后应立即用 file.lastModified() 读取并比对,确认结果符合预期。注意:两次调用之间不要间隔太短,避免因系统时钟精度或缓存造成误判。
- 读取值与你传入的
time不完全相等?可能是文件系统向下取整(如只支持秒) - 返回值始终是 0 或远小于预期?检查文件路径是否正确、是否被其他进程独占锁定
- Linux 下对某些挂载点(如 NFS、tmpfs)可能不支持修改,需实测
替代方案:NIO.2 的 Files.setLastModifiedTime()
如果项目已用 NIO.2,可用 Files.setLastModifiedTime(Path, FileTime),语义更清晰,异常更明确(如抛出 IOException 而非静默失败)。它底层也依赖同一系统调用,但封装更好,适合需要统一异常处理的场景。
- 需将
File转为Path:file.toPath() -
FileTime.from(Instant.now())可快速构造当前时间 - 对符号链接默认操作目标文件,行为比
File类更可控
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











