使用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");
}
}
}