当前位置: 首页 > news >正文

OSHI 介绍与使用

OSHI 介绍

OSHI(Operating System and Hardware Information)是一个开源的Java库,用于从操作系统和硬件层面获取系统资源的详细信息。它提供了对操作系统、硬件、CPU、内存、磁盘、网络接口等多种信息的访问,且不依赖于平台特定的API,能够在多种操作系统上(如Windows、Linux、macOS)无缝运行。OSHI的主要目标是简化系统信息的获取,减少开发者的工作量,尤其是在需要获取硬件和操作系统信息的情况下。

OSHI的主要功能

  1. 操作系统信息(Operating System)

    • 获取操作系统的名称、版本、架构、内核版本、系统类型等。
    • 访问操作系统的系统资源使用情况,如负载、运行时信息等。
  2. 硬件信息(Hardware)

    • 提供硬件抽象层(Hardware Abstraction Layer,HAL),可以访问和查询系统的硬件设备信息,如CPU、内存、硬盘、网络接口等。
    • CPU信息:如CPU型号、核心数、线程数等。
    • 内存信息:如总内存、已使用内存、剩余内存等。
    • 磁盘信息:磁盘型号、存储容量、已用空间等。
    • 网络接口信息:获取网络接口的名字、MAC地址、IP地址等。
  3. 传感器信息(Sensors)

    • 获取温度、风扇速度、CPU温度等传感器数据(在支持的平台上)。
  4. 传输和IO统计(IO and Transports)

    • 提供I/O操作的统计信息,如读写操作次数、字节数等。
    • 获取网络传输数据量(输入和输出)以及数据包统计。
  5. 系统性能指标(System Performance Metrics)

    • 提供系统负载、CPU使用率、内存使用率等性能指标。

OSHI的核心模块

OSHI的设计通过“硬件抽象层”(Hardware Abstraction Layer)来简化访问不同硬件组件的过程。其核心组件主要分为几个模块,每个模块负责不同的系统信息。

1. SystemInfo
  • SystemInfo类是获取系统和硬件信息的主要入口。它是OSHI库的核心类,包含了对操作系统和硬件的访问。通过它,你可以访问到操作系统、硬件、传感器和性能等信息。
  • 示例代码:
    SystemInfo systemInfo = new SystemInfo();
    OperatingSystem os = systemInfo.getOperatingSystem(); // 获取操作系统信息
    HardwareAbstractionLayer hardware = systemInfo.getHardware(); // 获取硬件信息
    
2. OperatingSystem
  • OperatingSystem类提供有关操作系统的信息,如操作系统的名称、版本、体系结构、内核版本等。
  • 示例代码:
    OperatingSystem os = systemInfo.getOperatingSystem();
    String osName = os.toString();
    
3. HardwareAbstractionLayer
  • HardwareAbstractionLayer(简称HAL)是OSHI的硬件信息接口,它封装了CPU、内存、磁盘、网络接口等硬件信息的获取方法。
  • 示例代码:
    HardwareAbstractionLayer hardware = systemInfo.getHardware();
    CentralProcessor processor = hardware.getProcessor();
    
4. CentralProcessor
  • CentralProcessor类用于获取CPU的信息,如核心数、线程数、处理器标识、处理器型号、CPU的负载等。
  • 示例代码:
    CentralProcessor processor = hardware.getProcessor();
    String cpuName = processor.getProcessorIdentifier().getName();
    int cpuCores = processor.getLogicalProcessorCount();
    
5. Memory
  • Memory类提供有关系统内存的信息,如总内存、可用内存、已使用内存等。
  • 示例代码:
    GlobalMemory memory = hardware.getMemory();
    long totalMemory = memory.getTotal();
    long availableMemory = memory.getAvailable();
    
6. Disks
  • Disk类提供关于存储设备的信息,如磁盘的容量、已用空间、磁盘名称等。
  • 示例代码:
    List<OSDisk> disks = hardware.getDiskStores();
    for (OSDisk disk : disks) {System.out.println("Disk: " + disk.getName() + " Size: " + disk.getSize());
    }
    
7. NetworkInterfaces
  • NetworkInterfaces类提供关于网络接口的信息,如IP地址、MAC地址、接口名称、流量统计等。
  • 示例代码:
    List<NetworkIF> networkIFs = hardware.getNetworkIFs();
    for (NetworkIF net : networkIFs) {System.out.println("Interface: " + net.getName() + " IP: " + net.getIPv4addr());
    }
    

使用OSHI的常见场景

  1. 系统监控

    • 获取系统负载、内存使用情况、CPU使用率等性能数据,帮助你监控服务器或工作站的状态。
  2. 硬件信息查询

    • 获取关于计算机硬件的详细信息,如CPU型号、内存大小、磁盘空间等,这对于自动化部署、资产管理等非常有用。
  3. 性能调优

    • 收集系统性能数据,帮助进行性能分析和调优。
  4. 服务器监控工具

    • OSHI可以作为构建自定义服务器监控工具的基础,结合其他工具和库进行深度集成。

示例代码:获取系统信息

下面是一个完整的例子,展示如何使用OSHI获取操作系统、CPU和内存信息:

import oshi.SystemInfo;
import oshi.hardware.CentralProcessor;
import oshi.hardware.HardwareAbstractionLayer;
import oshi.software.os.OperatingSystem;public class OSHIExample {public static void main(String[] args) {// 创建OSHI的SystemInfo实例SystemInfo systemInfo = new SystemInfo();// 获取操作系统信息OperatingSystem os = systemInfo.getOperatingSystem();System.out.println("OS: " + os);// 获取硬件信息HardwareAbstractionLayer hardware = systemInfo.getHardware();// 获取CPU信息CentralProcessor processor = hardware.getProcessor();System.out.println("CPU: " + processor.getProcessorIdentifier().getName());System.out.println("CPU Cores: " + processor.getLogicalProcessorCount());// 获取内存信息long totalMemory = hardware.getMemory().getTotal();System.out.println("Total Memory: " + totalMemory / 1024 / 1024 + " MB");}
}

支持的平台

OSHI支持多种操作系统,包括但不限于:

  • Windows
  • Linux
  • macOS
  • FreeBSD
  • Solaris

OSHI通过统一的API,简化了跨平台的硬件和操作系统信息获取,使其在不同平台上表现一致。

OSHI使用

在Spring Boot项目中使用OSHI(Operating System and Hardware Information)库,通常是为了获取有关操作系统、硬件、内存、CPU等系统资源的详细信息。OSHI是一个开源的Java库,可以帮助你在Java应用程序中获取操作系统和硬件的详细状态。

步骤 1:添加OSHI依赖

首先,你需要在Spring Boot项目的pom.xml文件中添加OSHI的Maven依赖:

<dependency><groupId>com.github.oshi</groupId><artifactId>oshi-core</artifactId><version>5.6.3</version> <!-- 使用最新版本 -->
</dependency>

步骤 2:使用OSHI获取系统信息

你可以在Spring Boot应用程序中创建一个服务类,使用OSHI来获取和返回系统信息。以下是一个简单的示例:

import oshi.SystemInfo;
import oshi.hardware.CentralProcessor;
import oshi.hardware.HardwareAbstractionLayer;
import oshi.software.os.OperatingSystem;import org.springframework.stereotype.Service;@Service
public class SystemInfoService {private final SystemInfo systemInfo;public SystemInfoService() {this.systemInfo = new SystemInfo(); // 创建SystemInfo实例}// 获取操作系统信息public String getOperatingSystemInfo() {OperatingSystem os = systemInfo.getOperatingSystem();return os.toString();}// 获取CPU信息public String getCpuInfo() {HardwareAbstractionLayer hardware = systemInfo.getHardware();CentralProcessor processor = hardware.getProcessor();return "CPU: " + processor.getProcessorIdentifier().getName() +", Cores: " + processor.getLogicalProcessorCount();}// 获取内存信息public String getMemoryInfo() {HardwareAbstractionLayer hardware = systemInfo.getHardware();long totalMemory = hardware.getMemory().getTotal();return "Total Memory: " + totalMemory / 1024 / 1024 + " MB";}
}

步骤 3:创建Controller来暴露这些信息

为了将这些信息展示给用户,你可以创建一个REST API接口来提供系统信息。

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class SystemInfoController {private final SystemInfoService systemInfoService;public SystemInfoController(SystemInfoService systemInfoService) {this.systemInfoService = systemInfoService;}@GetMapping("/api/system-info")public String getSystemInfo() {return "OS Info: " + systemInfoService.getOperatingSystemInfo() + "\n" +"CPU Info: " + systemInfoService.getCpuInfo() + "\n" +"Memory Info: " + systemInfoService.getMemoryInfo();}
}

步骤 4:访问API

启动你的Spring Boot应用程序后,访问以下URL,你就能看到系统的基本信息:

http://localhost:8080/api/system-info

OSHI提供的其他功能

OSHI除了提供系统、CPU和内存信息,还可以获取更多的硬件和操作系统的详细信息,如:

  • 获取磁盘信息 (systemInfo.getHardware().getDiskStores())
  • 获取网络接口信息 (systemInfo.getHardware().getNetworkIFs())
  • 获取操作系统版本和体系结构等。

这些都可以通过类似的方式进行访问和展示。你可以根据需要扩展和定制你的服务。

总结

使用OSHI与Spring Boot结合,可以轻松获取和展示系统的硬件和操作系统信息,适用于监控、诊断等多种应用场景。

相关文章:

OSHI 介绍与使用

OSHI 介绍 OSHI&#xff08;Operating System and Hardware Information&#xff09;是一个开源的Java库&#xff0c;用于从操作系统和硬件层面获取系统资源的详细信息。它提供了对操作系统、硬件、CPU、内存、磁盘、网络接口等多种信息的访问&#xff0c;且不依赖于平台特定的…...

Hadoop生态圈框架部署(八)- Hadoop高可用(HA)集群部署

文章目录 前言一、部署规划二、Hadoop HA集群部署&#xff08;手动部署&#xff09;1. 下载hadoop2. 上传安装包2. 解压hadoop安装包3. 配置hadoop配置文件3.1 虚拟机hadoop1修改hadoop配置文件3.1.1 修改 hadoop-env.sh 配置文件3.3.2 修改 core-site.xml 配置文件3.3.3 修改 …...

【RocketMQ】Name Server 无状态特点及如何让 Broker Consumer Producer 感知新节点

文章目录 前言1. Name Server 无状态特点2. Name Server 地址服务3. Name Server 手动配置后记 前言 看了 《RocketMQ 消息中间件实战派&#xff08;上册&#xff09;》前面一点&#xff0c;书中代码太多容易陷入细节。 这里简单描述下 RocketMQ Name Server 无状态表现在什么…...

蓝牙定位的MATLAB程序,四个锚点、三维空间

这段代码通过RSSI信号强度实现了在三维空间中的蓝牙定位&#xff0c;展示了如何使用锚点位置和测量的信号强度来估计未知点的位置。代码涉及信号衰减模型、距离计算和最小二乘法估计等基本概念&#xff0c;并通过三维可视化展示了真实位置与估计位置的关系。 目录 程序描述 运…...

机器学习--绪论

开启这一系列文章的初衷&#xff0c;是希望搭建一座通向机器学习世界的桥梁&#xff0c;为有志于探索这一领域的读者提供系统性指引和实践经验分享。随着人工智能和大数据技术的迅猛发展&#xff0c;机器学习已成为推动技术创新和社会变革的重要驱动力。从智能推荐系统到自然语…...

Unity 设计模式-命令模式(Command Pattern)详解

命令模式&#xff08;Command Pattern&#xff09;是一种行为型设计模式&#xff0c;它将请求封装成对象&#xff0c;从而使得可以使用不同的请求、队列或日志请求&#xff0c;以及支持可撤销的操作。命令模式通常包含四个主要角色&#xff1a;命令&#xff08;Command&#xf…...

线程信号量 Linux环境 C语言实现

既可以解决多个同类共享资源的互斥问题&#xff0c;也可以解决简易的同步问题 头文件&#xff1a;#include <semaphore.h> 类型&#xff1a;sem_t 初始化&#xff1a;int sem_init(sem_t *sem, int pshared, unsigned int value); //程序中第一次对指定信号量调用p、v操…...

karmada-descheduler

descheduler规则 karmada-descheduler 定期检测所有部署&#xff0c;通常是每2分钟一次&#xff0c;并确定目标调度集群中无法调度的副本数量。它通过调用 karmada-scheduler-estimator 来完成这个过程。如果发现无法调度的副本&#xff0c;它将通过减少 spec.clusters 的配…...

【热门主题】000075 探索嵌入式硬件设计的奥秘

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【热…...

Android okhttp请求

下面是一个用 OkHttp 封装的 GET 请求方法&#xff0c;适用于 Android 项目。该方法包括基本的网络请求、错误处理&#xff0c;并支持通过回调返回结果。 封装 GET 请求的工具类 添加依赖 在你的 build.gradle 文件中&#xff0c;确保添加了 OkHttp 的依赖&#xff1a; imple…...

嵌入式蓝桥杯学习4 lcd移植

cubemx配置 复制前面配置过的文件 打开cubemx&#xff0c;将PB8,PB9配置为GPIO-Output。 点击GENERATE CODE. 文件移植 1.打开比赛提供的文件包&#xff0c;点击Inc文件夹 2.点击Inc文件夹。复制fonts.h和lcd.h&#xff0c;粘贴到我们自己的工程文件夹的bsp中&#xff08…...

电子应用设计方案-38:智能语音系统方案设计

智能语音系统方案设计 一、引言 智能语音系统作为一种便捷、自然的人机交互方式&#xff0c;正逐渐在各个领域得到广泛应用。本方案旨在设计一个高效、准确、功能丰富的智能语音系统。 二、系统概述 1. 系统目标 - 实现高准确率的语音识别和自然流畅的语音合成。 - 支持多种语…...

渗透测试:网络安全的深度探索

一、引言 在当今数字化时代&#xff0c;网络安全问题日益凸显。企业和组织面临着来自各种恶意攻击者的威胁&#xff0c;他们试图窃取敏感信息、破坏系统或进行其他恶意活动。渗透测试作为一种主动的安全评估方法&#xff0c;能够帮助企业发现潜在的安全漏洞&#xff0c;提高网…...

基于SpringBoot的“小区物业管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“小区物业管理系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 个人信息界面图 费用信息管理…...

调试android 指纹遇到的坑

Android8以后版本 一、指纹服务不能自动 指纹服务fingerprintd(biometrics fingerprintservice)&#xff0c;可以手动起来&#xff0c;但是在init.rc中无法启动。 解决办法&#xff1a; 1.抓取开机时kernel log &#xff0c;确认我们的启动指纹服务的init.rc 文件有被init.c…...

剑指offer(专项突破)---字符串

总目录&#xff1a;剑指offer&#xff08;专项突破&#xff09;---目录-CSDN博客 1.字符串的基本知识 C语言中&#xff1a; 函数名功能描述strcpy(s1, s2)将字符串s2复制到字符串s1中&#xff0c;包括结束符\0&#xff0c;要求s1有足够空间容纳s2的内容。strncpy(s1, s2, n)…...

【springboot】 多数据源实现

文章目录 1. 引言&#xff1a;多数据源的必要性和应用场景**为什么需要多数据源&#xff1f;****应用场景** 2. Spring Boot中的数据源配置2.1 默认数据源配置简介2.2 如何在Spring Boot中配置多个数据源 3. 整合MyBatis与多数据源**配置MyBatis使用多数据源****Mapper接口的数…...

多模态COGMEN详解

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…...

django 实战(python 3.x/django 3/sqlite)

要在 Python 3.x 环境中使用 Django 3.2 和 SQLite 创建一个新的 Django 项目&#xff0c;你可以按照以下步骤进行操作。这些步骤假设你已经安装了 Python 3.x 和 pip。 1. 设置虚拟环境 首先&#xff0c;建议为你的 Django 项目创建一个虚拟环境&#xff0c;以便隔离项目的依…...

图数据库 | 12、图数据库架构设计——高性能计算架构

在传统类型的数据库架构设计中&#xff0c;通常不会单独介绍计算架构&#xff0c;一切都围绕存储引擎展开&#xff0c;毕竟存储架构是基础&#xff0c;尤其是在传统的基于磁盘存储的数据库架构设计中。 类似地&#xff0c;在图数据库架构设计中&#xff0c;项目就围绕存储的方…...

LeetCode 409:最长回文串 | 哈希表统计字符频率

LeetCode 409&#xff1a;最长回文串 | 哈希表统计字符频率 引言 最长回文串&#xff08;Longest Palindrome&#xff09;是 LeetCode 第 409 题&#xff0c;难度为 Easy。题目要求在给定字符串中构造最长的回文串&#xff0c;返回其长度。这道题虽然简单&#xff0c;但蕴含了回…...

3步解决微信红包难题:智能助手帮你告别手慢烦恼

3步解决微信红包难题&#xff1a;智能助手帮你告别手慢烦恼 【免费下载链接】WeChatLuckyMoney :money_with_wings: WeChats lucky money helper (微信抢红包插件) by Zhongyi Tong. An Android app that helps you snatch red packets in WeChat groups. 项目地址: https:/…...

Parsec虚拟显示驱动实战教程:5步创建完美游戏串流显示环境

Parsec虚拟显示驱动实战教程&#xff1a;5步创建完美游戏串流显示环境 【免费下载链接】parsec-vdd ✨ Perfect virtual display for game streaming 项目地址: https://gitcode.com/gh_mirrors/pa/parsec-vdd Parsec虚拟显示驱动&#xff08;Parsec VDD&#xff09;是一…...

OBS多平台直播插件:一次推流,全网同步的终极解决方案

OBS多平台直播插件&#xff1a;一次推流&#xff0c;全网同步的终极解决方案 【免费下载链接】obs-multi-rtmp OBS複数サイト同時配信プラグイン 项目地址: https://gitcode.com/gh_mirrors/ob/obs-multi-rtmp 你是否曾经想过&#xff0c;一场精彩的直播内容可以同时出现…...

QMCDecode终极指南:3步快速解锁QQ音乐加密格式,实现音频自由播放

QMCDecode终极指南&#xff1a;3步快速解锁QQ音乐加密格式&#xff0c;实现音频自由播放 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac&#xff0c;qmc0,qmc3转mp3, mflac,mflac0等转flac)&#xff0c;仅支持macOS&#xff0c;可自动识别到QQ音乐下载…...

如何快速掌握猫抓工具:终极视频嗅探与下载指南

如何快速掌握猫抓工具&#xff1a;终极视频嗅探与下载指南 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 还在为网页上的精彩视频无法保存而烦恼吗…...

C 语言通讯录(终版)|新手踩坑全总结 + 最终可运行代码博客简介

系列回顾 本系列三篇完整闭环&#xff1a; 第一篇&#xff08;基础版&#xff09;&#xff1a;从零实现增删查改 文件存储&#xff0c;踩遍新手所有坑&#xff08;格式符乱码、文件闪退、输入死循环&#xff09;&#xff1b;第二篇&#xff08;优化版&#xff09;&#xff1…...

如何快速突破百度网盘限速:高效下载工具终极指南

如何快速突破百度网盘限速&#xff1a;高效下载工具终极指南 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 百度网盘作为国内最流行的云存储平台&#xff0c;其下载速度限制一…...

Logistic Regression实战指南:Python构建可解释二分类模型

1. 这不是数学课&#xff0c;是解决真实问题的工具链——从“预测用户是否会点击广告”说起你手头有一份电商后台导出的用户行为日志&#xff1a;20万条记录&#xff0c;每条包含年龄、性别、浏览时长、页面跳转次数、是否收藏过商品、最近一次下单距今天数……最后一列是标签&…...

C++lambda表达式深入解析

Clambda表达式深入解析lambda表达式是C11引入的匿名函数特性&#xff0c;它提供了一种简洁的方式来定义内联函数对象&#xff0c;特别适合用于STL算法和回调函数。lambda表达式的基本语法包括捕获列表、参数列表、返回类型和函数体。#include #include #include #includevoid b…...