Java中获取文件大小和修改时间推荐使用NIO.2的Files API:Files.size()获取字节数(抛IOException),Files.getLastModifiedTime()返回FileTime;File类可用length()和lastModified(),但健壮性较差。

Java 中获取文件大小和修改时间,主要用 java.io.File 或更推荐的 java.nio.file(NIO.2)API。后者更现代、功能更强,且能正确处理符号链接、权限异常等边界情况。
用 File 类(简单场景)
File 是最直接的方式,适合单个文件、不涉及复杂路径或异常处理的场景:
-
获取大小:调用
file.length(),单位是字节;如果文件不存在或为目录,返回0; -
获取最后修改时间:调用
file.lastModified(),返回自 1970-01-01 00:00:00 UTC 起的毫秒数;可用new Date(file.lastModified())或Instant.ofEpochMilli(...)转成可读时间。
示例:
File f = new File("data.txt");if (f.exists() && f.isFile()) {
long size = f.length(); // 字节数
long modTime = f.lastModified(); // 毫秒时间戳
System.out.println("大小:" + size + " 字节,修改时间:" + new Date(modTime));
}
用 Files 和 Path(推荐,更健壮)
NIO.2 的 Files 工具类配合 Path,支持异常明确抛出、属性访问更灵活,还能读取基本文件属性(BasicFileAttributes):
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
立即学习“Java免费学习笔记(深入)”;
-
获取大小:用
Files.size(path),会抛出IOException(如无权限、文件被删除),比File.length()更安全; -
获取修改时间:用
Files.getLastModifiedTime(path),返回FileTime对象,可转为毫秒或格式化字符串; - 也可一次性读取多个属性:
Files.readAttributes(path, BasicFileAttributes.class),避免多次 I/O。
示例:
Path path = Paths.get("data.txt");try {
long size = Files.size(path);
FileTime modTime = Files.getLastModifiedTime(path);
System.out.println("大小:" + size + " 字节");
System.out.println("修改时间:" + modTime); // 默认 ISO 格式,如 2024-05-10T14:22:33.123Z
} catch (IOException e) {
e.printStackTrace();
}
注意几个关键细节
-
目录不能用
size():对目录调用Files.size()会抛出IOException(Not a file);File.length()对目录返回0,容易误导;建议先用Files.isRegularFile(path)或file.isFile()判断; -
时区问题:
FileTime和lastModified()都是基于系统默认时区显示的毫秒值,实际存储是 UTC;格式化时若需本地时间,可用modTime.toInstant().atZone(ZoneId.systemDefault()); -
符号链接处理:默认情况下,
Files.size()和getLastModifiedTime()跟随符号链接;如需获取链接本身属性,加参数LinkOption.NOFOLLOW_LINKS。
补充:获取创建时间和访问时间(部分系统支持)
标准 Java 不保证支持创建时间(creation time)和最后访问时间(last access time),但某些文件系统(如 NTFS、ext4)支持。可通过 Files.readAttributes() 尝试读取 DosFileAttributes(Windows)或 PosixFileAttributes(Linux/macOS),但需捕获 UnsupportedOperationException。
try {
DosFileAttributes attrs = Files.readAttributes(path, DosFileAttributes.class);
System.out.println("创建时间:" + attrs.creationTime());
} catch (UnsupportedOperationException | IOException e) {
// 不支持或出错,忽略或降级处理
}

















