使用Sigar获取磁盘相关信息
做java的人都知道获取磁盘相关的信息是一件很痛苦的事情,因为jdk自身带的api满足不了我们的需求,因此很多人会专门呢针对不同的操作系统进行硬编码(例如在windows下写一套代码在linux下写一套代码),为了让大家都愉快的获取计算机磁盘信息,推荐大家使用Sigar这个jar包,它是跨平台使用的,满足目前大部分全世界上的计算机操作系统(对于我们来说完全够了),对于不同的操作系统只需要引入相应的文件即可(例如windows下引入dll文件),方便使用,当然我还会介绍另一种获取磁盘信息的方法,不过没有sigar获得的信息全面。
首先介绍非Sigar方式获取磁盘信息的方法:
import java.io.File; import java.io.IOException; import java.text.NumberFormat; import java.util.ArrayList; import java.util.List; import javax.swing.filechooser.FileSystemView; /** * 磁盘信息 * * @author mxy QQ:987938582 * */ final public class SysDiskInfo implements java.io.Serializable { /**************** Disk *********************/ private boolean isSysDisk;// 是不是系统盘 private String diskName;// 磁盘名称 private String driveLetter;// 驱动器,比如window下的 d: private String diskType;// 文件系统类型 private String totlaDiskSpace;// 磁盘容量 private String availDiskSpace;// 磁盘可用容量 private String inUseDiskSpace;// 已用磁盘容量 private String freeDiskSpace;// 未用用磁盘容量 private String useRate;// 使用率 /**************** Disk *********************/ /** * 获取磁盘信息 * @return */ public static List<SysDiskInfo> fillSysDiskInfo(){ List<SysDiskInfo> dlist = null; String localDiskName = "本地磁盘"; String removableDiskName = "可移动磁盘"; String enLocalDiskName = "Local Disk"; String enRemovableDiskName = "Removable Disk"; FileSystemView fsv = FileSystemView.getFileSystemView();// 获取FileSystemView对象 double unit = 1024 * 1024 * 1024; File[] roots = File.listRoots(); dlist = new ArrayList<SysDiskInfo>(); for (File file : roots) { SysDiskInfo diskInfo = new SysDiskInfo(); diskInfo.setDiskName(fsv.getSystemDisplayName(file));//磁盘名称以及盘符,例如:本地磁盘(C:) try { diskInfo.setDriveLetter(file.getCanonicalPath());//磁盘盘符 } catch (IOException e) { e.printStackTrace(); } String diskName = fsv.getSystemTypeDescription(file); // 获取磁盘的类型描述信息 if (diskName.startsWith(localDiskName) || diskName.startsWith(enLocalDiskName)){ // 当磁盘为本地磁盘时 //本地磁盘 long totalDiskSpace = file.getTotalSpace(); // 获取磁盘的总空间 //totalDiskSpace>>30相当于totalDiskSpace/(1024*1024*1024) //diskInfo.setTotlaDiskSpace(numToPoint(totalDiskSpace>>30,2));//磁盘的总空间 diskInfo.setTotlaDiskSpace(numToPoint(totalDiskSpace / unit,2));//磁盘的总空间 long freeDiskSpace = file.getFreeSpace(); // 获取磁盘的可用空间 diskInfo.setFreeDiskSpace(numToPoint(freeDiskSpace / unit,2));// 磁盘的可用空间 diskInfo.setAvailDiskSpace(numToPoint(freeDiskSpace / unit,2));// 磁盘的可用空间 long inUseDiskSpace = totalDiskSpace - freeDiskSpace;// 已用磁盘空间 diskInfo.setInUseDiskSpace(numToPoint(inUseDiskSpace / unit,2));//已用磁盘空间 diskInfo.setUseRate(divisionToPoint(inUseDiskSpace, totalDiskSpace,2));// 磁盘使用率 } else if (diskName.startsWith(removableDiskName) || diskName.startsWith(enRemovableDiskName)){ // 当磁盘为可移动磁盘时 //移动磁盘 long totalDiskSpace = file.getTotalSpace(); // 获取磁盘的总空间 diskInfo.setTotlaDiskSpace(numToPoint(totalDiskSpace / unit,2));//磁盘的总空间 long freeDiskSpace = file.getUsableSpace(); // 获取磁盘的可用空间 diskInfo.setFreeDiskSpace(numToPoint(freeDiskSpace / unit,2));// 磁盘的可用空间 diskInfo.setAvailDiskSpace(numToPoint(freeDiskSpace / unit,2));// 磁盘的可用空间 long inUseDiskSpace = totalDiskSpace - freeDiskSpace;// 已用磁盘空间 diskInfo.setInUseDiskSpace(numToPoint(inUseDiskSpace / unit,2));//已用磁盘空间 diskInfo.setUseRate(divisionToPoint(inUseDiskSpace, totalDiskSpace,2));// 磁盘使用率 }else { continue; } dlist.add(diskInfo); } return dlist; } /** * 两数相除获取指定位小数 * * @param startNum * 被除数 1/2中的1 * @param endNum * 除数1/2中的2,注意:除数不能为0 * @param length * 要保留几位小数 * @return 相除后指定位小数的结果 */ public static String divisionToPoint(long startNum, long endNum, int length) throws ArithmeticException { if (endNum == 0) { // 除数不能为0 throw new ArithmeticException("除数不能为0"); } double num = (double)(startNum/1) / endNum; return numToPoint(num, length); } /** * 将数字转为小数点 * * @param num * double类型的小数 * @param length * 要保留的小数点位数 * @return 截取的指定为小数 */ public static String numToPoint(double num, int length) { NumberFormat nf = NumberFormat.getNumberInstance(); nf.setMaximumFractionDigits(length); return nf.format(num); } public boolean isSysDisk() { return isSysDisk; } public void setSysDisk(boolean isSysDisk) { this.isSysDisk = isSysDisk; } public String getDiskName() { return diskName; } public void setDiskName(String diskName) { this.diskName = diskName; } public String getDriveLetter() { return driveLetter; } public void setDriveLetter(String driveLetter) { this.driveLetter = driveLetter; } public String getTotlaDiskSpace() { return totlaDiskSpace; } public void setTotlaDiskSpace(String totlaDiskSpace) { this.totlaDiskSpace = totlaDiskSpace; } public String getAvailDiskSpace() { return availDiskSpace; } public void setAvailDiskSpace(String availDiskSpace) { this.availDiskSpace = availDiskSpace; } public String getInUseDiskSpace() { return inUseDiskSpace; } public void setInUseDiskSpace(String inUseDiskSpace) { this.inUseDiskSpace = inUseDiskSpace; } public String getFreeDiskSpace() { return freeDiskSpace; } public void setFreeDiskSpace(String freeDiskSpace) { this.freeDiskSpace = freeDiskSpace; } public String getDiskType() { return diskType; } public void setDiskType(String diskType) { this.diskType = diskType; } public String getUseRate() { return useRate; } public void setUseRate(String useRate) { this.useRate = useRate; } public static void main(String[] args) { List<SysDiskInfo> dlist = fillSysDiskInfo(); for (int i = 0; i < dlist.size(); i++) { System.out.println(); SysDiskInfo disk = dlist.get(i); //System.out.println("是不是系统盘:"+disk.isSysDisk());// 是不是系统盘 System.out.println("驱动器:"+disk.getDriveLetter());// 驱动器,比如window下的 d: //System.out.println("文件系统类型:"+disk.getDiskType());// 文件系统类型 System.out.println("磁盘容量:"+ disk.getTotlaDiskSpace()+"G");// 磁盘容量 System.out.println("磁盘使用率:"+ Double.valueOf(disk.getUseRate())*100 +"%"); System.out.println("磁盘已用容量:"+ disk.getInUseDiskSpace() +"G"); System.out.println("磁盘可用容量:"+ disk.getFreeDiskSpace() +"G"); } } }