Java 的 File 类无法直接获取文件创建时间和最后访问时间,因其基于早期操作系统抽象且跨平台兼容性受限,仅支持 lastModified();自 Java 7 起应使用 NIO.2 的 Files.readAttributes() 配合 BasicFileAttributes 获取完整时间戳。

Java 的 File 类(即 java.io.File)**无法直接获取文件的创建时间与最后访问时间**,这是因为它基于早期操作系统抽象,只暴露了有限的元数据,仅支持 lastModified()(最后修改时间),不包含创建时间(creation time)和最后访问时间(last access time)。
为什么 File 类不支持创建时间和访问时间?
主要原因有两点:
- 跨平台兼容性限制:早期 Java 设计时,很多操作系统(如经典 Unix)根本不记录或不公开创建时间;Windows 虽然支持,但 POSIX 标准未定义创建时间字段,JVM 为统一行为选择不暴露。
-
File 类已过时且功能受限:自 Java 7 引入 NIO.2(
java.nio.file)后,File类被明确标记为“legacy”,推荐使用Path和Files配合BasicFileAttributes或特定属性视图来获取完整时间戳。
正确方式:用 NIO.2 获取创建时间与最后访问时间
使用 Files.readAttributes() 读取 BasicFileAttributes,它在支持的操作系统上可提供三项时间:
-
creationTime()→ 文件创建时间(Windows、macOS、部分 Linux 文件系统如 ext4/btrfs 启用birthtime后支持) -
lastAccessTime()→ 最后访问时间(注意:Linux 默认可能禁用 atime 更新以提升性能,需挂载选项如relatime或strictatime) -
lastModifiedTime()→ 最后修改时间(所有平台都支持)
示例代码:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
立即学习“Java免费学习笔记(深入)”;
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.time.Instant;
Path path = Paths.get("/path/to/file");
try {
BasicFileAttributes attrs = Files.readAttributes(path, BasicFileAttributes.class);
System.out.println("创建时间: " + attrs.creationTime());
System.out.println("最后访问: " + attrs.lastAccessTime());
System.out.println("最后修改: " + attrs.lastModifiedTime());
} catch (IOException e) {
e.printStackTrace();
}
注意事项与常见问题
实际使用中需注意以下几点:
-
不是所有文件系统都支持 birth time(创建时间):例如传统 ext3/ext2、XFS(默认)不保存创建时间;Linux 内核 4.11+ + ext4/btrfs + 启用
fileattr才能可靠获取。若不支持,creationTime()可能返回 1970-01-01 或抛出UnsupportedOperationException。 -
最后访问时间可能不准或被禁用:Linux 挂载时若使用
noatime(常见于服务器),则不会更新 atime;此时lastAccessTime()返回的是上次真正访问或挂载后的时间,而非实时值。 -
权限与符号链接:默认读取的是目标文件属性(跟随符号链接);如需读取链接本身属性,改用
Files.readAttributes(path, BasicFileAttributes.class, LinkOption.NOFOLLOW_LINKS)。
替代方案:通过平台命令(不推荐,仅作备选)
极端场景下(如必须支持老旧 JDK 或特殊需求),可通过 Runtime.exec() 调用系统命令(如 Windows 的 dir、macOS/Linux 的 stat),但存在安全、可移植性、解析复杂等严重缺陷,不应作为常规手段。

















