可通过FileStore获取磁盘总空间和可用空间并手动计算百分比,需用getUsableSpace()/getTotalSpace()、避免除零、注意文件系统保留空间及权限影响。

可以通过 FileStore 获取磁盘总空间和可用空间,再计算出可用百分比。注意:NIO.2 的 FileStore 不直接提供“已用”或“百分比”方法,需手动计算,且要避免除零、考虑单位一致性(字节)、并注意不同文件系统对“可用空间”的定义(如是否包含保留空间)。
获取 FileStore 实例
从任意路径出发,通过 Files.getFileStore(Path) 获取对应分区的 FileStore:
Path path = Paths.get("/"); // 或 Paths.get("C:\")(Windows)
FileStore store = Files.getFileStore(path);该 FileStore 代表该路径所在物理/逻辑卷(如 /、C:、/home 等),不是整个磁盘的抽象——若挂载了多个分区,需分别查询。
读取空间信息并计算百分比
FileStore 提供三个关键方法:
-
getUsableSpace():普通用户可写入的字节数(推荐用于“可用”计算) -
getTotalSpace():总字节数 -
getUnallocatedSpace():未分配字节数(不等于可用,因含保留块、权限限制等)
计算可用百分比(以 getUsableSpace() / getTotalSpace() 为主):
long total = store.getTotalSpace();
long usable = store.getUsableSpace();
<p>if (total > 0) {
double percent = (double) usable / total * 100.0;
System.out.printf("可用空间占比:%.2f%%
", percent);
}</p>注意事项与健壮性处理
- 某些文件系统(如 ext4)默认为 root 保留 5% 空间,
getUsableSpace()已排除这部分,对普通用户更真实 -
getUsableSpace()可能返回 0(如满盘、权限不足、只读挂载),应检查并提示 - 不要用
getUnallocatedSpace()替代getUsableSpace()—— 它不反映实际可写容量 - Windows 下若路径跨符号链接或网络驱动器,
getFileStore()可能抛IOException,建议 try-catch
完整示例(含异常处理)
以下代码安全获取根分区可用百分比:
public static double getUsablePercent(String pathStr) throws IOException {
Path path = Paths.get(pathStr);
FileStore store = Files.getFileStore(path);
long total = store.getTotalSpace();
long usable = store.getUsableSpace();
return total > 0 ? (double) usable / total * 100.0 : 0.0;
}
<p>// 使用
try {
double p = getUsablePercent("/");
System.out.printf("根分区可用率:%.1f%%
", p);
} catch (IOException e) {
System.err.println("无法获取磁盘信息:" + e.getMessage());
}</p>不复杂但容易忽略单位一致性和边界情况。










