当前位置: 首页 > 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;项目就围绕存储的方…...

2026年,AI到底杀死了哪些行业?又催生了哪些新机会?

AI对传统行业的冲击2026年&#xff0c;AI的快速发展可能导致部分传统行业被大幅削弱甚至消失&#xff1a;客服行业&#xff1a;智能客服系统&#xff08;如ChatGPT、语音AI&#xff09;已能高效处理大部分标准化咨询&#xff0c;人工客服需求锐减。数据录入与基础会计&#xff…...

Electron实战:将你的网页应用打包成桌面客户端

在当今数字化时代&#xff0c;网页应用已经渗透到我们工作和生活的方方面面。有时我们仍然需要一个桌面客户端来提供更稳定的运行环境、离线功能或更好的系统集成。Electron作为一个强大的跨平台框架&#xff0c;能够帮助开发者轻松将网页应用打包成桌面客户端。无论是开发效率…...

ChatGLM3-6B-128K vs ChatGLM3-6B:Ollama环境下的8K/128K场景选型指南

ChatGLM3-6B-128K vs ChatGLM3-6B&#xff1a;Ollama环境下的8K/128K场景选型指南 1. 两种模型的核心差异 ChatGLM3-6B和ChatGLM3-6B-128K都是基于ChatGLM3系列的开源对话模型&#xff0c;但它们在处理长文本能力上有着本质区别。 ChatGLM3-6B是标准版本&#xff0c;支持最多…...

3 个高级思路,让你的 AI 绘画 / 视频从此充满想象力

前言 如今 AI 视频与绘画工具的画质越来越卷&#xff0c;清晰度、光影、细节几乎都已触达天花板。但真正能让人记住、能脱颖而出的作品&#xff0c;靠的从来不是画质&#xff0c;而是想象力。 当所有人都在追求 “大片感” 时&#xff0c;你只需要换一种思路 ——用创意打破平…...

如何通过智慧树自动化学习助手解决网课学习效率问题

如何通过智慧树自动化学习助手解决网课学习效率问题 【免费下载链接】zhihuishu 智慧树刷课插件&#xff0c;自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 副标题&#xff1a;面向时间紧张学习者的智能网课辅助工具 一、价…...

Android开发者的USB摄像头避坑指南:从设备枚举到SurfaceView预览的完整流程

Android开发者实战&#xff1a;USB摄像头集成全流程与疑难解析 去年接手一个医疗设备项目时&#xff0c;我需要在Android平板上接入工业级USB摄像头。本以为三天能搞定&#xff0c;结果光是解决画面拉伸问题就耗了一周。这份踩坑经验总结&#xff0c;将带你系统掌握从设备枚举到…...

ESC固件底层开发:寄存器级驱动与无传感器换相实现

1. ESC固件底层技术解析&#xff1a;电子调速器固件架构与驱动实现电子调速器&#xff08;Electronic Speed Controller, ESC&#xff09;是无人机、电动航模、机器人驱动系统中的核心执行单元&#xff0c;其本质是一个高动态响应的三相逆变器控制器。ESC固件并非简单的PWM输出…...

基于深度学习的文本情感分析改进模型实验方案

基于深度学习的文本情感分析改进模型实验方案 一、实验背景与目的 1.1 背景 情感分析是自然语言处理的核心任务之一,旨在自动识别文本所表达的情感倾向(如正面、负面)。传统机器学习方法依赖人工特征工程,而深度学习方法能够自动学习文本的层次化特征表示。然而,现有模…...

基于胸部正位X光片的两阶段对比学习椎体压缩性骨折筛查框架文献速递-多模态医学影像最新进展

2026.4.2本研究提出一种基于胸部正位X光片的双阶段对比学习框架TADC-Net&#xff0c;通过模仿放射科医生的诊断流程&#xff0c;解决了器官遮挡和类间相似性等挑战&#xff0c;实现了椎体压缩性骨折的早期精准筛查&#xff0c;显著提升了诊断性能和临床辅助准确性。Title题目01…...

LSM303D六轴IMU驱动开发:I²C底层集成与100Hz高精度运动检测

1. LSM303D传感器驱动库深度解析&#xff1a;面向嵌入式系统的IC底层集成与高精度运动检测实现LSM303D是意法半导体&#xff08;STMicroelectronics&#xff09;推出的超低功耗、高精度六轴惯性测量单元&#xff08;IMU&#xff09;&#xff0c;集成3轴加速度计与3轴磁力计于单…...