如何在Java中获取Windows共享文件夹的磁盘使用统计信息?
核心方案:Java标准库File/Path API
Java标准IO库直接支持对挂载的共享目录(包括NFS、SMB等)获取空间统计,无需依赖第三方库。关键是确保共享目录已正确挂载到本地文件系统(Linux),或在Windows下映射为网络驱动器。
1. Java 7+ 推荐方案:使用Files类
通过Files.getFileStore()获取路径对应的存储对象,进而读取空间数据:
import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.FileStore; public class SharedDirSpace { public static void main(String[] args) { // Linux下直接用挂载后的路径,如"/mnt/shared/content";Windows可用映射驱动器如"Z:\\content" Path sharedPath = Paths.get("//shared/content"); try { FileStore store = Files.getFileStore(sharedPath); long totalSpace = store.getTotalSpace(); long usableSpace = store.getUsableSpace(); long unallocatedSpace = store.getUnallocatedSpace(); System.out.printf("总空间: %.2f GB%n", totalSpace / (1024.0 * 1024 * 1024)); System.out.printf("可用空间: %.2f GB%n", usableSpace / (1024.0 * 1024 * 1024)); System.out.printf("未分配空间: %.2f GB%n", unallocatedSpace / (1024.0 * 1024 * 1024)); } catch (Exception e) { e.printStackTrace(); System.err.println("无法获取共享目录空间信息:" + e.getMessage()); } } }
2. Java 6 兼容方案:使用File类
如果项目仍基于Java 6,可通过File类的方法实现:
import java.io.File; public class SharedDirSpaceLegacy { public static void main(String[] args) { File sharedDir = new File("//shared/content"); if (sharedDir.exists() && sharedDir.isDirectory()) { long totalSpace = sharedDir.getTotalSpace(); long usableSpace = sharedDir.getUsableSpace(); long freeSpace = sharedDir.getFreeSpace(); System.out.printf("总空间: %.2f GB%n", totalSpace / (1024.0 * 1024 * 1024)); System.out.printf("可用空间: %.2f GB%n", usableSpace / (1024.0 * 1024 * 1024)); System.out.printf("空闲空间: %.2f GB%n", freeSpace / (1024.0 * 1024 * 1024)); } else { System.err.println("共享目录不存在或不是有效目录"); } } }
Linux下NFS场景的关键注意事项
- 必须先将
//shared/content通过NFS挂载到本地(比如挂载到/mnt/shared/content),直接使用挂载后的本地路径才能获取正确的空间数据。 - 若未挂载,Java无法直接访问未挂载的NFS路径,需先通过系统
mount命令完成挂载(也可在Java中调用系统命令执行挂载)。
为什么OSHI无法获取?
OSHI主要读取系统本地磁盘/存储设备的信息,对于网络共享存储,只有当它被识别为系统挂载点时才会被扫描。而Java标准库直接针对文件系统路径获取所在存储的信息,更适配共享目录场景。
常见问题排查
- 权限问题:运行Java程序的用户必须拥有共享目录的读取权限,否则会抛出权限异常。
- 路径格式:Linux下SMB共享需用
smb://shared/content,且需安装cifs-utils等客户端工具并完成挂载;NFS使用标准挂载路径即可。 - 连接问题:若共享目录无法访问,会抛出
IOException,需检查网络连接和共享配置。
内容的提问来源于stack exchange,提问作者Shubhankar Kumar
相关产品推荐
相关产品推荐

