filesystems.getdefault() 返回 jvm 启动时默认挂载的本地操作系统文件系统单例实例,如 linux 的 ext4 或 windows 的 ntfs,非虚拟文件系统,不支持 jar、网络或内存路径。

FileSystems.getDefault() 返回的是什么文件系统
它返回的是 JVM 启动时默认挂载的 FileSystem 实例,通常是底层操作系统的本地文件系统(如 Linux 的 ext4、Windows 的 NTFS),**不是**一个抽象容器或虚拟文件系统。这个实例由 JVM 自动初始化,和 java.io.File 底层共享同一套路径解析逻辑,但行为更严格(比如不自动处理路径分隔符混用)。
- 调用
FileSystems.getDefault()多次会返回同一个单例对象,无需缓存 - 它不支持访问 jar 内部资源(
jar:file:///...)、网络路径或内存文件系统(如 jimfs),那些需要显式用FileSystems.newFileSystem(...) - 在容器或某些嵌入式环境里,如果
user.dir或java.home路径不可读,可能触发ProviderNotFoundException
如何用 FileStore 获取磁盘使用量(空间监控核心)
FileStore 是获取存储设备级信息的唯一可靠入口,对应操作系统中的“挂载点”或“卷”。它能提供已用/可用/总空间(字节)、是否只读、是否可刷新等真实状态,比单纯检查 File.getTotalSpace() 更准确(后者在某些 JDK 版本有缓存 bug)。
- 从路径获取:
Files.getFileStore(Paths.get("/"))—— 注意必须是**根路径或已存在的挂载点路径**,否则抛IOException - 遍历所有挂载点:
FileSystems.getDefault().getFileStores(),适用于多磁盘监控场景 - 关键方法:
getTotalSpace()、getUsableSpace()(非 root 用户可用空间)、getUnallocatedSpace()(未分配空间,Linux 下常为 0) - 注意单位是字节,别直接打印;
getUsableSpace()可能远小于getTotalSpace() - getUsedSpace(),因存在 reserved blocks(如 ext4 默认保留 5% 给 root)
FileStore.getName() 和 type() 在跨平台监控中的陷阱
getName() 返回的是操作系统级标识符(如 Linux 的 /dev/sda1,Windows 的 C:),而 type() 返回字符串描述(如 ext4、NTFS)。这两者**不能用于跨平台路径拼接或配置硬编码**,因为不同系统返回值差异大,且同一系统重启后设备名也可能变(如 udev 规则变动)。
- 监控脚本中应优先用挂载路径(如
/data)作为维度,而不是FileStore.getName() -
type()值依赖底层 OS 和 JDK 实现,OpenJDK 和 IBM J9 对 ZFS、Btrfs 的识别可能不一致 - 在 Docker 容器里,
FileStore显示的是宿主机的卷信息,不是容器 layer —— 想监控容器内层大小得用 cgroups 或du -sh /var/lib/docker/overlay2/...
FileSystems.newFileSystem() 与监控无关,别误用
这个方法用来打开 ZIP/JAR、自定义协议(如 mem://)或第三方文件系统(如 Hadoop’s hdfs://),但它创建的 FileSystem 实例**无法通过 getFileStores() 获取宿主机磁盘信息**,也无法用于空间监控。
立即学习“Java免费学习笔记(深入)”;
- 例如:
FileSystems.newFileSystem(URI.create("jar:file:///app.jar"), Map.of())返回的是 jar 内部视图,其getFileStores()为空集合 - 试图对这类文件系统调用
Files.getFileStore(path)会直接抛UnsupportedOperationException - 如果你看到监控代码里混用了
newFileSystem()和磁盘用量统计,基本可以确定逻辑错位了
真正做存储监控时,FileStore 是唯一可信的数据源,但它的粒度只到挂载点 —— 如果业务数据分散在多个子目录且需精确到目录级用量,就得配合 Files.walk() 或外部命令(du);另外,getUsableSpace() 的结果每秒都在变,频繁轮询要加锁或限频,不然容易拖垮 JVM 的 I/O 线程。











