Java中获取和修改文件属性推荐使用NIO.2的Files与BasicFileAttributes:用Files.readAttributes一次性获取大小、时间戳及类型等;Files.getLastModifiedTime单独读取修改时间;Files.setLastModifiedTime更新时间戳;旧File类仅限简单兼容场景。

Java 中获取文件属性(如大小、是否可读写、是否为目录)和修改时间,主要通过 java.nio.file 包中的 Files 和 BasicFileAttributes 类实现,推荐使用 NIO.2(Java 7+),它比旧的 File 类更安全、功能更丰富、支持符号链接和跨平台属性。
用 Files.readAttributes 获取完整基础属性
这是最常用且推荐的方式,一次性读取包括最后修改时间、创建时间、最后访问时间、文件大小、是否为目录/常规文件等信息:
- 调用
Files.readAttributes(path, BasicFileAttributes.class) - 返回的
BasicFileAttributes对象提供lastModifiedTime()、creationTime()、lastAccessTime()、size()、isDirectory()、isRegularFile()等方法 - 注意:这些时间返回的是
FileTime类型,需用toMillis()或toString()转换为人可读格式
示例:
Path path = Paths.get("example.txt");
try {
BasicFileAttributes attrs = Files.readAttributes(path, BasicFileAttributes.class);
System.out.println("大小: " + attrs.size() + " 字节");
System.out.println("最后修改时间: " + attrs.lastModifiedTime());
System.out.println("是否为文件: " + attrs.isRegularFile());
} catch (IOException e) {
e.printStackTrace();
}
单独获取最后修改时间(简洁场景)
如果只关心修改时间,可用 Files.getLastModifiedTime(),代码更简短:
立即学习“Java免费学习笔记(深入)”;
- 直接返回
FileTime,无需先获取全部属性 - 适合日志检查、缓存刷新判断等轻量用途
- 若路径不存在或无权限,会抛出
IOException
示例:
try {
FileTime mtime = Files.getLastModifiedTime(path);
System.out.println("修改时间戳(毫秒): " + mtime.toMillis());
System.out.println("格式化时间: " + new Date(mtime.toMillis()));
} catch (IOException e) {
System.err.println("无法读取修改时间: " + e.getMessage());
}
修改文件最后修改时间
使用 Files.setLastModifiedTime() 可更新时间戳,常用于同步、备份或测试场景:
- 传入
FileTime.from(Instant.now())可设为当前时间 - 也可用
FileTime.fromMillis(long)指定毫秒值 - 注意:某些文件系统(如 FAT32)可能不支持纳秒精度,会自动向下取整到 2 秒或 10 毫秒级
- 操作需要对应文件的写权限,否则抛出
IOException或SecurityException
示例:
try {
FileTime now = FileTime.from(Instant.now());
Files.setLastModifiedTime(path, now);
System.out.println("修改时间已更新为: " + now);
} catch (IOException e) {
System.err.println("设置失败: " + e.getMessage());
}
兼容旧版 File 类(仅限简单需求)
若项目仍用 java.io.File,可通过以下方式获取部分属性:
-
file.length()→ 文件大小(字节) -
file.lastModified()→ 修改时间(毫秒,自 1970-01-01 UTC) -
file.isDirectory()/file.isFile()/file.canRead()等布尔判断 - 缺点:不支持创建时间、访问时间;无法处理符号链接;API 不支持异步或批量操作
不建议新项目使用,仅用于维护遗留代码。


















