files.size() 直接返回常规文件的字节数,要求路径存在、可读且为普通文件,否则抛出相应异常;相比 file.length() 更安全明确,推荐新项目使用。

Files.size 可以直接返回文件的字节数,但要注意它只适用于**常规文件(regular file)**,且必须确保路径存在、可访问、不是目录或符号链接(除非启用了跟随链接选项)。
确保传入的是有效文件路径
Files.size 接收一个 Path 对象,该路径必须指向一个真实存在的、可读的普通文件。如果路径不存在、是目录、是符号链接(默认不解析),或权限不足,会抛出异常:
- NoSuchFileException:路径不存在
- NotDirectoryException:路径存在但指向目录
- AccessDeniedException:无读取权限
- IOException:其他 I/O 错误(如磁盘故障)
基本用法示例
最简调用方式如下:
import java.nio.file.Files;
import java.nio.file.Path;
long size = Files.size(Path.of("/path/to/file.txt")); // 返回 long 类型字节数
注意:返回值是 long,不是 int,可支持超大文件(>2GB);无需手动打开/关闭流,底层由 JVM 直接读取文件系统元数据(如 inode 大小),因此极快且精准。
安全调用建议(避免异常中断)
生产代码中推荐先校验路径有效性:
- 用 Files.isRegularFile(path) 确认是普通文件(自动处理符号链接:默认不跟随,若需跟随可用
Files.isRegularFile(path, LinkOption.NOFOLLOW_LINKS)) - 用 Files.exists(path) 提前判断路径是否存在
- 捕获特定异常,而不是裸 throw 或 catch Exception
例如:
Path path = Path.of("data.log");
if (Files.exists(path) && Files.isRegularFile(path)) {
try {
long bytes = Files.size(path);
System.out.println("文件大小:" + bytes + " 字节");
} catch (IOException e) {
// 权限问题或 I/O 故障
System.err.println("读取文件大小失败:" + e.getMessage());
}
} else {
System.err.println("路径无效或不是普通文件");
}
和 file.length() 的区别
Files.size() 和 new File(...).length() 都返回字节数,但关键差异在于:
-
File.length()对不存在的文件或目录也返回 0(静默失败),容易掩盖问题 -
Files.size()严格校验并抛异常,行为更明确、更安全 -
Files.size()是 NIO.2 标准 API,支持更多路径类型(如自定义 FileSystem),语义更清晰
因此,新项目中优先使用 Files.size。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











