Files.getAttribute() 单字段获取:解析如何精准提取文件的大小(size)或创建时间变量
使用Files.getAttribute()在basic视图下获取size(跨平台稳定,返回long字节数)或creationTime(Windows/macOS正常,Linux可能返回默认值,需转为FileTime)。属性名必须为"size"/"creationTime",否则抛异常。Files.size()可替代获取size。
在Ja va里处理文件属性,如果只想查单个字段——比如文件大小或创建时间——最直接的手段就是 Files.getAttribute()。不过,用这个方法有个前提:得把 attribute name 和 view type 搞对,还得留意不同操作系统的“脾气”。
先说结论:size 和 creationTime 都属于 basic 视图,但前者跨平台很稳,后者在 Linux 上可能会“翻车”。具体怎么用?咱们拆开来看。
获取文件大小(size)
文件大小再常见不过了,属于 basic 视图的标配属性。技术上讲,它返回一个 long 类型,单位是字节,跨平台兼容性极好,普通权限就能读。写法也很简单:
- attribute name 直接写
"size",注意是字符串,不是常量。 - 返回值是
long,推荐用泛型重载避免强制类型转换的麻烦。
举个例子:
Path path = Paths.get("example.txt");
long size = (long) Files.getAttribute(path, "size"); // 非泛型写法,需要转型
// 更安全一点:
long size = Files.getAttribute(path, "size", LinkOption.NOFOLLOW_LINKS);
如果你只是想拿文件大小,Files.size(path) 其实更省事——少写几个字母,逻辑也更直白。
获取创建时间(creationTime)
创建时间这个字段就有点“看人下菜碟”了。它同样属于 basic 视图,但 Windows 和 macOS 上表现良好,而 Linux(比如 ext4 文件系统)往往不保存这个信息,返回的结果可能是默认值(比如 1970-01-01 那个“Unix纪元”)。
- attribute name 写
"creationTime"。 - 返回值类型是
FileTime,需要调用.toInstant()或.toMillis()转换成你需要的格式。 - 建议带上
LinkOption.NOFOLLOW_LINKS,避免符号链接的干扰。
代码像这样:
Path path = Paths.get("example.txt");
FileTime creationTime = (FileTime) Files.getAttribute(path, "creationTime");
Instant instant = creationTime.toInstant(); // 转成标准时间点
需要提醒的是,如果你只关心最后修改时间,Files.getLastModifiedTime(path) 不仅更直观,兼容性也更好——这一刀切下去,少踩很多坑。
值得留意的几个坑
- attribute name 别写错:写成
"fileSize"或"created"这种自定义名称,Ja va 会直接抛UnsupportedOperationException,一点情面都不讲。 - 只管单个文件:这个方法只查单个文件的属性,别指望它帮你遍历目录或批量读取——那得另请高明。
- 权限和异常:没有读权限就抛
AccessDeniedException,路径不存在就是NoSuchFileException,都很直白。 - 替代方案:前面提到了,
Files.size()和Files.getLastModifiedTime()在某些场景下比getAttribute更顺手——不是非用这个方法不可,选最合适的就行。



































