`
fenxiang
  • 浏览: 6825 次
社区版块
存档分类
最新评论

Sigar系列二:使用Sigar获取磁盘相关信息

阅读更多

 

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

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    使用sigar获取系统信息,内存,磁盘,jvm虚拟机等

    本项目主要关注如何使用Sigar库在Java环境下获取系统信息,特别是内存、磁盘和JVM虚拟机的相关数据。 一、获取系统内存信息 在Java中使用Sigar库获取系统内存信息,主要涉及以下几个方面: 1. **总内存**:通过`...

    借助Sigar API获取磁盘信息

    3. 查询磁盘信息:有了磁盘名后,我们就可以使用`sigar.getDiskUsage(disk)`来获取该磁盘的使用情况。返回的是`org.hyperic.sigar.SigarProxyCache.DiskUsage`对象,包含了总容量、已用空间、剩余空间以及使用率等...

    sigar 获取OS系统信息

    Sigar(System Information Gatherer and Reporter)是由Hyperic公司开发的一款跨平台的系统监控库,它提供了丰富的API,可以方便地获取操作系统级别的信息,包括CPU、内存、进程、磁盘等资源的使用情况。...

    sigar 获取系统信息

    Sigar(System Information Gatherer and Reporter)是一款强大的跨平台系统信息收集库,它允许开发者以一致的方式获取多种操作系统上的系统状态信息,包括但不限于CPU使用率、内存利用率、磁盘使用情况等。...

    如何借助Sigar API获取CPU相关信息

    Sigar(System Information Gatherer and Reporter)是一款强大的跨平台系统信息收集库,它提供了一种简单的方法来获取操作系统级别的信息,包括CPU、内存、网络、磁盘和其他资源的状态。本项目将详细介绍如何利用...

    sigar获取服务器负载信息需要的sigar等相关的文件

    包括:libsigar-aarch64-linux.so、libsigar-amd64-linux.so、libsigar-x86-linux.so、sigar-amd64-winnt.dll、sigar-x86-winnt.dll、sigar-x86-winnt.lib

    借助Sigar API获取网络信息

    Sigar(System Information Gatherer and Reporter)是一款强大的跨平台系统信息收集库,它提供了一种简单的方法来获取操作系统级别的信息,包括但不限于网络状态、进程信息、内存使用情况、磁盘统计等。在Java环境...

    借助Sigar API获取获取内存信息

    Sigar(System Information Gatherer and Reporter)是一款强大的跨平台系统信息收集库,它提供了一种简单的方法来获取操作系统级别的信息,包括内存、CPU、网络、磁盘和其他资源的状态。本项目旨在演示如何利用...

    SpringBoot结合Sigar获取服务器监控信息源代码

    SpringBoot结合Sigar获取服务器监控信息提供restful接口的源代码, 并使用swagger生成接口文档, 包括 CPU信息,服务器基本信息,内存信息, JVM信息,磁盘信息等. 有详细的代码注释.

    sigar-1.6.4 包+Sigar_1.6.4.CHM

    - **进程信息**:使用`sigar_proc_list_get()`获取当前系统上的所有进程信息,或者使用`sigar_pid_get()`获取特定PID的进程详细信息。 - **内存信息**:`sigar_mem_get()`用于获取系统的总体内存使用情况,包括...

    Sigar包相关

    Sigar(System Information Gatherer and Reporter)是一款强大的跨平台系统信息收集库,它提供了一种简单、统一的方式来获取操作系统的基本信息,包括但不限于内存状态、CPU使用率、进程信息、网络状态、磁盘I/O等...

    hyperic-sigar-1.6.4相关文件

    SIGAR提供了一致的接口来获取各种操作系统的信息,如CPU使用率、内存状态、网络配置、进程信息等。 描述中提到的错误可能是在尝试使用SIGAR库时,由于缺少必要的库文件或者配置,导致程序无法正常运行。解决方法是...

    借助Sigar API获取操作系统信息

    它提供了一种统一的接口,允许开发者在多种操作系统上获取各种系统级别的信息,包括但不限于CPU状态、内存使用情况、网络连接、文件系统、进程信息等。这个API在Java、Perl、Python、Ruby等多种语言中都有支持,使得...

    sigar获取系统属性的jar

    Sigar(System Information Gatherer and Reporter)是一款强大的跨平台系统信息收集库,它允许开发者获取各种操作系统级别的数据,如CPU使用率、内存状态、网络信息、进程详情等。标题中的"sigar获取系统属性的jar...

    java源码:sigar_mirror(系统信息收集API_Sigar).rar

    Sigar(System Information Gatherer and Reporter)是一款强大的跨平台系统信息收集库,它提供了一种简单统一的API,用于获取操作系统级别的信息,如进程、内存、网络、磁盘等状态。在Java中,通过sigar_mirror项目...

    java获取各进程的信息

    Sigar是一个跨平台的系统监视接口,它提供了统一的API来获取操作系统相关的各种信息,包括但不限于CPU负载、内存使用、进程管理等。Sigar支持Windows、Linux等多种操作系统,是进行系统级监控的理想选择之一。 ####...

    sigar兼容linux和windows

    Sigar(System Information Gatherer and Reporter)是一款跨平台的系统信息收集库,它为开发者提供了一种简单的方式来获取操作系统及硬件的各种信息。Sigar库由Hypertable项目开发并维护,现在已成为Apache软件基金...

    java(sigar1.6) 获取本地系统信息大全 示例project

    Java SIGAR库是一个强大的工具,用于跨平台地获取操作系统级别的信息。这个项目示例主要展示了如何使用SIGAR库1.6版本来收集和分析本地系统的各种信息,包括JVM、内存、操作系统、文件系统和网络状态。以下是这些...

    Java获取磁盘使用率

    Sigar库提供了一套跨平台的API,可以方便地获取包括磁盘使用率在内的各种系统信息。引入该库后,获取磁盘使用率的代码会更加简洁: ```java import org.hyperic.sigar.Sigar; import org.hyperic.sigar....

    sigar.jar 获取cpu,内存,磁盘等信息

    Sigar.jar包是通过本地方法来调用操作系统API来获取系统相关数据。Windows操作系统下Sigar.jar依赖sigar-amd64-winnt.dll或sigar-x86-winnt.dll,linux 操作系统下则依赖libsigar-amd64-linux.so或libsigar-x86-...

Global site tag (gtag.js) - Google Analytics