java中获取文件最后修改时间推荐使用nio.2的files.readattributes()配合basicfileattributes,返回filetime对象;传统file.lastmodified()简单但精度低、不处理异常。

Java 中获取文件最后修改时间,主要通过 java.io.File 或更推荐的 java.nio.file(NIO.2)API 实现。后者功能更强、线程安全、支持符号链接和更多文件属性,是现代 Java 的标准做法。
使用 NIO.2 的 Files 和 BasicFileAttributes(推荐)
这是最健壮、跨平台且符合最佳实践的方式:
- 调用
Files.readAttributes(path, BasicFileAttributes.class)获取基础属性对象 - 调用
fileAttrs.lastModifiedTime()返回FileTime对象 - 可转为毫秒(
toMillis())、Instant(toInstant())或格式化字符串
示例代码:
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.time.Instant;
Path path = Paths.get("example.txt");
try {
BasicFileAttributes attrs = Files.readAttributes(path, BasicFileAttributes.class);
FileTime lastMod = attrs.lastModifiedTime();
System.out.println("最后修改时间(毫秒): " + lastMod.toMillis());
System.out.println("最后修改时间(Instant): " + lastMod.toInstant());
} catch (IOException e) {
e.printStackTrace();
}
使用传统 File 类(兼容旧代码)
简单直接,适用于快速脚本或遗留项目,但不支持某些高级文件系统特性:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- 调用
file.lastModified()直接返回long类型毫秒值(自 1970-01-01 UTC 起) - 可用
new Date(file.lastModified())或Instant.ofEpochMilli(...)转换为时间对象 - 注意:若文件不存在或无读取权限,返回值为
0L,需手动检查
示例:
import java.io.File;
import java.time.Instant;
File file = new File("example.txt");
if (file.exists()) {
long millis = file.lastModified();
System.out.println("最后修改时间: " + Instant.ofEpochMilli(millis));
} else {
System.out.println("文件不存在");
}
注意事项与常见问题
实际使用中需留意以下细节:
-
时区无关性:所有 API 返回的时间均基于 UTC 毫秒,显示时建议用
DateTimeFormatter显式指定时区 -
精度限制:不同操作系统精度不同(如 Windows 通常为 10ms,Linux ext4 可达 1ns),
FileTime保留原始精度,lastModified()强制截断为毫秒 -
符号链接处理:NIO.2 默认跟随符号链接;如需获取链接本身的属性,加
LinkOption.NOFOLLOW_LINKS -
异常处理:NIO.2 抛出受检异常
IOException,必须捕获或声明;File.lastModified()失败仅静默返回0L,易被忽略
转换为易读格式(可选)
将 FileTime 或毫秒值转为带时区的字符串便于日志或展示:
import java.time.format.DateTimeFormatter;
import java.time.ZoneId;
FileTime lastMod = ...;
Instant instant = lastMod.toInstant();
String formatted = instant.atZone(ZoneId.systemDefault())
.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));
System.out.println("格式化时间: " + formatted);
不复杂但容易忽略细节,优先用 NIO.2,兼顾准确性、可维护性和跨平台一致性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










