使用Sigar包获取操作系统信息[通俗易懂]

使用Sigar包获取操作系统信息[通俗易懂]项目中的一个需求是获取操作系统的相关信息,可以收集的信息包括:1,CPU信息,包括基本信息(vendor、model、mhz、cacheSize)和统计信息(user、sys、idle、nice、wait)2,文件系统信息,包括Filesystem、Size、Used、Avail、Use%、Type3,事件信息,类似ServiceControlManager4,内存信息

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

    项目中的一个需求是获取操作系统的相关信息,  在网上找了相关的资料,发现了一个好的玩意,就是Sigar,它是通过java api的方式来调用程序,基本上能够获取操作系统的全部信息,感觉挺强大的。Sigar(System Information Gatherer And Reporter),是一个开源的工具,提供了跨平台的系统信息收集的API,核心由C语言实现的,它可以被多种语言调用,包括C/C++、java、Perl、Ruby、PHP等,可以收集的信息包括:

1, CPU信息,包括基本信息(vendor、model、mhz、cacheSize)和统计信息(user、sys、idle、nice、wait)
2, 文件系统信息,包括Filesystem、Size、Used、Avail、Use%、Type
3, 事件信息,类似Service Control Manager
4, 内存信息,物理内存和交换内存的总数、使用数、剩余数;RAM的大小
5, 网络信息,包括网络接口信息和网络路由信息
6, 进程信息,包括每个进程的内存、CPU占用数、状态、参数、句柄
7, IO信息,包括IO的状态,读写大小等
8, 服务状态信息,系统日志信息
9, 系统信息,包括操作系统版本,系统资源限制情况,系统运行时间以及负载,JAVA的版本信息等

     Sigar现在在github上面是属于开源软件,大家可以看它的源代码:https://github.com/hyperic/sigar

        系统中如果要使用Sigar,可以下载它的jar包,下载地址:https://sourceforge.net/projects/sigar/,如果是maven工程的话,可以在pom.xml文件中添加:

                 <dependency>
			<groupId>org.hyperic</groupId>
			<artifactId>sigar</artifactId>
			<version>1.6.5.132-6</version>
		</dependency>

Jetbrains全家桶1年46,售后保障稳定      
新建工程,导入sigar的jar包,然后编写测试代码获取windows操作系统CPU信息:

package com.harderxin.test;

import org.hyperic.sigar.CpuPerc;
import org.hyperic.sigar.Sigar;
import org.hyperic.sigar.SigarException;

import com.harderxin.util.SigarUtil;

public class TestSigar {
	public static void main(String[] args) {
		try {
			Sigar sigar = new Sigar();
			CpuPerc cpu = sigar.getCpuPerc();
			System.out.println(String.valueOf(cpu.getCombined()));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

} 

运行上面一段代码程序,会发现报错了,错误信息如下:

使用Sigar包获取操作系统信息[通俗易懂]

原因是因为操作系统底层采用C语言实现,我们通过Sigar调用操作系统信息,实际上是通过JNI调用C语言相关的api,所以这里面需要用到dll文件,如果我们获取windows操作系统信息,我们需要设置这几个文件的环境变量:sigar-amd64-winnt.dll、sigar-x86-winnt.dll、sigar-x86-winnt.lib,如果需要获取mac系统或者linux系统,那么需要相对应的*-mac.dll,*-linux.dll,*-unix.dll文件,这些文件可以在下载包的hyperic-sigar-1.6.4\sigar-bin\lib目录中找到,环境 设变量设置方式可以有几种,我是需要获取windows系统信息,所以以windows操作系统为例,一种是直接将这三个文件放入jdk的bin目录,第二种方式是把上面三个文件添加到c:\WINDOWS\system32目录下,第三种方式就是在程序中通过System.setProperty(“java.library.path”, path)的方式动态设置环境变量,推荐使用第三种方式,如果用第三种方式,那么需要将相关文件放到工程目录下。

我在工程中将文件放到了工程目录的conf目录下,使用了一个工具类来动态加载环境变量,代码如下:

import java.io.File;

import org.apache.log4j.Logger;
import org.hyperic.sigar.win32.EventLog;
import org.hyperic.sigar.win32.Win32Exception;

/**
 * Support classes using the sigar package
 * 
 * @author phil.wu
 */
public class SigarUtil {

	private static Logger logger = Logger.getLogger(SigarUtil.class.getName());

	/**
	 * set sigar package system variable
	 */
	public static final void setSystemVariable() {
		try {
			String classPath = System.getProperty("user.dir") + File.separator + "conf";
			String path = System.getProperty("java.library.path");
			if (OsCheck.getOperatingSystemType() == OsCheck.OSType.Windows) {
				path += ";" + classPath;
			} else {
				path += ":" + classPath;
			}
			System.setProperty("java.library.path", path);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

加上这个辅助类之后,我们在源程序中添加一行代码,就可以获取到系统信息了:

package com.harderxin.test;

import org.hyperic.sigar.CpuPerc;
import org.hyperic.sigar.Sigar;
import org.hyperic.sigar.SigarException;

import com.harderxin.util.SigarUtil;

public class TestSigar {
	public static void main(String[] args) {
		try {
			//set sigar variable
			SigarUtil.setSystemVariable();
			Sigar sigar = new Sigar();
			CpuPerc cpu = sigar.getCpuPerc();
			System.out.println(String.valueOf(cpu.getCombined()));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

} 

1、使用Sigar api获取操作系统应用日志信息,还可以获取安全日志信息、系统日志信息等:

import org.hyperic.sigar.win32.EventLog;
import org.hyperic.sigar.win32.EventLogRecord;
import org.hyperic.sigar.win32.Win32Exception;

import com.harderxin.util.SigarUtil;

public class EventLogInfoTest {
	public static void main(String[] args) throws Exception {
		SigarUtil.setSystemVariable();
		EventLogRecord record;
		EventLog log = new EventLog();
		log.open(EventLog.APPLICATION);
		int oldestRecord = log.getOldestRecord();
		System.out.println("oldestRecord : " + oldestRecord);
		int numRecords = log.getNumberOfRecords();
		System.out.println("numRecords : " + numRecords);
		int newsRecords = log.getNewestRecord();
		System.out.println("newsRecords : " + newsRecords);
		record = log.read(newsRecords);
		System.out.println(record.getComputerName() + "--" + record.getEventId() + "--" + record.getEventType()
		+ "--" + record.getMessage());
		
		for (int i = oldestRecord; i < newsRecords; i++) {
			try {
				record = log.read(i);
				System.out.println(record.getComputerName() + "--" + record.getEventId() + "--" + record.getEventType()
						+ "--" + record.getMessage());
			} catch (Win32Exception e) {
				e.printStackTrace();
			}
		}
		log.close();
	}
}

2、使用Sigar api获取CPU使用率信息

	// 打印cpu的使用率
	private void printCpuPerc(CpuPerc cpuPerc) {
		String cpuPercUser = CpuPerc.format(cpuPerc.getUser());// 用户使用率
		String cpuPercSys = CpuPerc.format(cpuPerc.getSys());// 用户使用率
		String cpuPercWait = CpuPerc.format(cpuPerc.getWait());// 用户使用率
		String cpuPercNice = CpuPerc.format(cpuPerc.getNice());// 用户使用率
		String cpuPercIdle = CpuPerc.format(cpuPerc.getIdle());// 用户使用率
		String cpuPercCombined = CpuPerc.format(cpuPerc.getCombined());// 用户使用率

		System.out.println("用户使用率:" + cpuPercUser);
		System.out.println("系统使用率:" + cpuPercSys);// 系统使用率
		System.out.println("当前等待率:" + cpuPercWait);// 当前等待率
		System.out.println("Nice :" + cpuPercNice);//
		System.out.println("当前空闲率:" + cpuPercIdle);// 当前空闲率
		System.out.println("总的使用率:" + cpuPercCombined);// 总的使用率
		System.out.println("**************");
	}

3、使用Sigar api获取内存资源信息:

	// 物理内存信息
	public void getPhyssicalMemory() {
		DecimalFormat df = new DecimalFormat("#0.00");
		Sigar sigar = new Sigar();
		Mem mem;
		try {
			mem = sigar.getMem();
			// 内存总量
			String memTotal = df.format((float) mem.getTotal() / 1024 / 1024 / 1024) + "G";
			// 当前内存使用量
			String memUsed = df.format((float) mem.getUsed() / 1024 / 1024 / 1024) + "G";
			// 当前内存剩余量
			String memFree = df.format((float) mem.getFree() / 1024 / 1024 / 1024) + "G";

			// 系统页面文件交换区信息
			Swap swap = sigar.getSwap();
			// 交换区总量
			String swapTotal = df.format((float) swap.getTotal() / 1024 / 1024 / 1024) + "G";
			// 当前交换区使用量
			String swapUsed = df.format((float) swap.getUsed() / 1024 / 1024 / 1024) + "G";
			// 当前交换区剩余量
			String swapFree = df.format((float) swap.getFree() / 1024 / 1024 / 1024) + "G";

			// 打印信息
			System.out.println("内存总量:" + memTotal);
			System.out.println("当前内存使用量:" + memUsed);
			System.out.println("当前内存剩余量:" + memFree);
			System.out.println("交换区总量:" + swapTotal);
			System.out.println("当前交换区使用量:" + swapUsed);
			System.out.println("当前交换区剩余量:" + swapFree);

		} catch (SigarException e) {
			e.printStackTrace();
		}
	}

其他Demo案例以及Sigar的jar包和dll依赖文件,请在我的资源库中进行下载:点击我进行下载

sigar学习参考博文:http://www.cnblogs.com/mr-totoro/p/4974979.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/219251.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • linux 重启服务器命令[通俗易懂]

    linux 重启服务器命令[通俗易懂]Linux有如下的关机和重启命令:shutdown,reboot,halt,poweroff,那么它们有什么区别呢?shutdown-建议使用的命令shutdown是最常用也是最安全的关机和重启命令,它会在关机之前调用fsck检查磁盘,其中-h和-r是最常用的参数:-h:停止系统服务并关机-r:停止系统服务后重启下面看几个例子:shutdown-h…

    2022年10月18日
  • 乐观锁和悲观锁实现(java乐观锁实现)

    推荐阅读:如何在技术领域持续成长后端程序员必备的Linux基础知识后端必备——数据通信知识(RPC、消息队列)一站式总结何谓悲观锁与乐观锁乐观锁对应于生活中乐观的人总是想着事情往好的方向发展,悲观锁对应于生活中悲观的人总是想着事情往坏的方向发展。这两种人各有优缺点,不能不以场景而定说一种人好于另外一种人。悲观锁总是假设最坏的情况,每次去拿数据的时候都认为…

  • 深度|常见IT人才外包存在的问题及解决建议

    深度|常见IT人才外包存在的问题及解决建议何谓“IT人才外包”IT人才外包,是指企业根据需要将某一项或几项项目开发中所涉及的工作外包出去,交由其他企业安排程序员驻点开发。IT人才外包也叫程序员外包、程序员外派。在IT人才外包中,外包公司提供程序员之后,就不再对程序员进行指挥。用工单位在生产经营上,对派遣员工拥有和正式员工一样完整的管理、指挥权力,但是每个程序员的工资、社保等费用由外包公司。IT人才外包的好处与存在的问题1人才外包的好处1、…

  • 数据挖掘的过程有哪些[通俗易懂]

    数据挖掘的过程有哪些[通俗易懂]  随着大数据时代的到来,各行各业都无法避免数据洪流的洗礼,一场无声的数据变革在悄然发生。谁能更好地将隐藏在数据背后有价值的信息挖掘出来,就意味着谁能在这种变化中获得主动权,能更快更好地发展。在这背景下,加强对大数据挖掘已成为许多企业迫切需要进行的任务。  以下将从数据挖掘的概念、数据挖掘分类和数据挖掘过程三个方面进行分析,帮助您更好地理解数据挖掘。  一、数据挖掘的概念  数据挖掘是指从数据库的大量数据中揭示隐含和潜在信息的非凡过程。从数据中获取有用的信息和知识,协助事务运作,改进商品,协助企

  • XenServer存储概述

    XenServer存储概述

  • jsNavigator对象的讲解_javascript自定义对象

    jsNavigator对象的讲解_javascript自定义对象 JSnavigator对象 转自:http://blog.163.com/tgaosh@126/blog/static/139818624201012651556709/ navigator是一个独立的对象,他用于提供用户所使用的浏览器以及操作系统等信息,以navigator对象属性的形式来提供。————————————-…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号