java nio.2 的 filestore 类可跨平台获取磁盘分区底层存储信息,提供 gettotalspace()(标称容量,含预留空间)、getusablespace()(当前用户可用空间,真实写入依据)和 getunallocatedspace()(未分配空闲空间)三个关键方法,需结合理解避免误判。

Java 通过 NIO.2 的 FileStore 类,能跨平台、无需外部命令直接获取磁盘分区的底层存储信息。它不依赖 shell 或系统工具,适合嵌入监控服务、资源调度模块或轻量级运维 SDK 中。
核心字段含义与实际意义
FileStore 提供三个关键容量方法,需结合理解才能避免误判:
- getTotalSpace():文件系统总字节数(含保留块),即“标称容量”。注意:对 ext4 等文件系统,通常有 5% 预留空间(root 用户可用,普通用户不可见),此值包含该部分。
-
getUsableSpace():当前用户(运行 JVM 的用户)可写入的字节数。它已扣除预留空间,并受用户配额(如 quota)、挂载选项(如
noexec、ro)影响,是判断“应用能否继续写入”的真实依据。 -
getUnallocatedSpace():尚未分配给任何文件/目录的空闲字节数(不含预留块)。该值常接近
getUsableSpace(),但在启用了配额或 thin-provisioning 的存储上可能显著不同。
获取所有挂载点的 FileStore 列表
使用 FileSystems.getDefault().getFileStores() 可遍历全部文件系统。但要注意:
- 某些虚拟文件系统(如
proc、sysfs、overlay)返回的容量为 0 或抛出IOException,应主动跳过; - 容器环境(如 Docker)中,
/proc/mounts可能显示多个挂载点,但FileStore仅反映宿主机视角的物理/逻辑卷,无法识别容器绑定挂载的独立配额; - 建议用
fileStore.name()和fileStore.type()过滤掉非持久化存储(如tmpfs),避免干扰主磁盘监控逻辑。
安全读取与异常处理要点
NIO.2 的容量方法在某些条件下会抛异常,不能忽略:
- 访问被卸载的挂载点 → 抛
IOException(如 NFS 服务器宕机); - 权限不足(如只读挂载且调用
getUsableSpace())→ 返回 0,而非异常; - 为防阻塞,不应在高频采集线程中反复调用(尤其在低性能存储上),可设定最小刷新间隔(如 30 秒);
- 推荐封装一层容错方法:捕获
IOException后返回 null 或标记“不可用”,并在日志中记录设备名和异常原因。
与 df 命令结果对齐的注意事项
若需将 Java 输出与 df -h 对比验证,注意以下差异点:
-
df默认显示getUsableSpace()(对应 Avail 字段),不是getUnallocatedSpace(); -
df -i显示的是 inode 使用率,FileStore**不提供 inode 相关接口**,Java 层需调用Files.getAttribute(path, "unix:fileKey")等间接方式,或执行Runtime.getRuntime().exec("df -i"); -
df的 Use% 是按(Used / Total) × 100计算,而 Java 中Used = Total − Unallocated,但因预留空间存在,该差值可能略大于df所示 Used,属正常行为。










