BasicFileAttributes是Java NIO.2中用于跨平台读取文件基础元数据的核心接口,通过Files.readAttributes()获取,支持大小、时间戳、类型判断等;配合SimpleFileVisitor可高效批量访问;时间精度依赖底层文件系统,需注意时区与异常处理。

在Java中,BasicFileAttributes 是 NIO.2(java.nio.file.attribute)提供的核心接口之一,用于读取文件的基础元数据,比如创建时间、最后修改时间、最后访问时间、是否为目录/常规文件、大小等。它不依赖操作系统特定属性,跨平台兼容性好,是日常开发中最常用的一组文件属性。
获取 BasicFileAttributes 的标准方式:Files.readAttributes()
最直接、推荐的方式是调用 Files.readAttributes() 方法,传入路径和属性类型:
- 使用
Path对象表示目标文件或目录 - 指定属性视图类型为
BasicFileAttributes.class - 方法返回一个不可变的
BasicFileAttributes实例
示例代码:
import java.io.IOException; import java.nio.file.*; import java.nio.file.attribute.BasicFileAttributes;Path path = Paths.get("example.txt"); try { BasicFileAttributes attrs = Files.readAttributes(path, BasicFileAttributes.class); System.out.println("大小: " + attrs.size() + " 字节"); System.out.println("是否为目录: " + attrs.isDirectory()); System.out.println("是否为常规文件: " + attrs.isRegularFile()); System.out.println("创建时间: " + attrs.creationTime()); System.out.println("最后修改时间: " + attrs.lastModifiedTime()); System.out.println("最后访问时间: " + attrs.lastAccessTime()); } catch (IOException e) { e.printStackTrace(); }
配合 FileVisitor 遍历目录时批量读取属性
当需要递归处理整个目录树(如查找某天修改的文件),可结合 SimpleFileVisitor 在访问每个文件时直接获取其 BasicFileAttributes,避免重复调用 Files.readAttributes():
立即学习“Java免费学习笔记(深入)”;
- 重写
visitFile()或preVisitDirectory()方法 - 方法参数中已包含当前文件的
BasicFileAttributes - 无需额外查询,性能更优
示例片段:
Files.walkFileTree(Paths.get("src"), new SimpleFileVisitor() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
if (attrs.isRegularFile() && attrs.size() > 1024 * 1024) {
System.out.println("大文件: " + file + " (" + attrs.size() + " 字节)");
}
return FileVisitResult.CONTINUE;
}
}); 注意时区与精度限制
BasicFileAttributes 中的时间字段(creationTime()、lastModifiedTime() 等)返回的是 FileTime 对象,它内部以纳秒精度存储,但实际精度取决于底层文件系统:
- Windows NTFS 通常支持 100 纳秒精度
- Linux ext4 一般只记录到秒或纳秒(依内核和挂载选项而定)
-
FileTime默认按系统默认时区格式化输出,如需 UTC 或指定格式,需手动转换
例如转为毫秒时间戳:
long modifiedMillis = attrs.lastModifiedTime().toMillis();
BasicFileAttributes vs 其他属性视图
如果只需要基础信息,BasicFileAttributes 足够且轻量;若需更多细节,可选用其他视图:
-
DosFileAttributes:Windows 下的只读、隐藏、系统、存档标志 -
PosixFileAttributes:Linux/macOS 下的权限(owner/group/others)、所有者、组 -
AclFileAttributes:访问控制列表(ACL),需系统支持
它们都可通过 Files.readAttributes() 获取,只需替换泛型类型即可。
基本上就这些。用好 BasicFileAttributes 能帮你快速、安全、跨平台地拿到文件关键元数据,不复杂但容易忽略细节——尤其是时间精度和异常处理。










