File类的totalSpace()、freeSpace()和usableSpace()分别返回磁盘总容量、空闲空间和进程实际可用空间,均需作用于根路径或挂载点,其中usableSpace()最能反映应用真实可用容量。

Java 中 File 类的 totalSpace()、freeSpace() 和 usableSpace() 是获取磁盘空间信息的三个关键方法,它们返回的是字节数(long 类型),使用时需注意单位换算和权限限制。
三个方法的区别与含义
这三个方法都作用于代表**根路径或挂载点**的 File 对象(如 new File("/") 或 new File("C:\")),不是任意文件或目录:
-
totalSpace():磁盘总容量(格式化后的总大小),即“标称容量”,不考虑系统保留空间 -
freeSpace():当前未被任何用户或进程占用的空闲空间(包括 root 用户保留部分),普通程序可能无法写入这部分空间 -
usableSpace():当前进程**实际可写入的空间**,已扣除操作系统为 root 保留的空间(如 Linux 的 5% reserved blocks),最能反映应用真实可用容量
基本用法示例
以 Windows C 盘和 Linux 根目录为例:
File root = new File("C:\"); // Windows
// 或 File root = new File("/"); // Linux/macOS
<p>if (root.exists() && root.isDirectory()) {
long total = root.getTotalSpace(); // 总空间
long free = root.getFreeSpace(); // 空闲空间
long usable = root.getUsableSpace(); // 可用空间(推荐用这个)</p><pre class="brush:php;toolbar:false;">System.out.printf("总空间: %.2f GB%n", total / (1024.0 * 1024 * 1024));
System.out.printf("空闲空间: %.2f GB%n", free / (1024.0 * 1024 * 1024));
System.out.printf("可用空间: %.2f GB%n", usable / (1024.0 * 1024 * 1024));}
常见注意事项
这些方法看似简单,但容易踩坑:
- 必须传入根路径或挂载点(如
"C:\"、"/"、"/mnt/data"),对普通子目录调用会返回其所在分区的信息,不是该目录自身占用量 - 返回值是
long,直接除以1024*1024*1024要注意浮点精度,建议用double运算或java.util.concurrent.TimeUnit辅助转换 - 在某些受限环境(如容器、无权限挂载点、网络文件系统 NFS)下,
freeSpace()或usableSpace()可能返回0或异常小的值,需做容错判断 -
usableSpace()在 Windows 上通常等于freeSpace()(Windows 不设 reserved space),但在 Linux/macOS 上更准确
替代方案:更现代的 Files API(推荐)
Java 7+ 提供了更健壮的 java.nio.file.FileStore 方式,支持跨文件系统、可枚举所有挂载点:
try {
Path path = Paths.get("/"); // 或 Paths.get("C:\")
FileStore store = Files.getFileStore(path);
long total = store.getTotalSpace();
long usable = store.getUsableSpace();
String name = store.name(); // 如 "rootfs"、"C:"
} catch (IOException e) {
e.printStackTrace();
}
相比 File 类,FileStore 更清晰、支持更多文件系统特性,且能通过 FileSystems.getDefault().getFileStores() 获取全部挂载点列表。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











