oshi 获取当前计算机系统和硬件的配置信息
简介
在java开发中,有时需要获取计算机的相关硬件信息,例如显卡、内存条、CPU、主板等。本文将提供如何使用 java 获取这些硬
件信息 的代码示例。
1、引入pom依赖
本项目主要使用开源 oshi 的jar
,在pom
文件中引入如下依赖,此处使用 5.7.4
版本:
<dependency>
<groupId>com.github.oshi</groupId>
<artifactId>oshi-core</artifactId>
<version>5.7.4</version>
</dependency>
2、创建 service 接口
package com.public_wechat.service;
/**
* @author : gaogao
* @version 1.0
* @date : 2023-12-14 15:28
*/
public interface ComputerComponentService {
/**
* 获取显卡信息
*/
void queryGraphicsCardMessage();
/**
* 获取内存条信息
*/
void queryMemoryMessage();
/**
* 获取CPU信息
*/
void queryCentralMessage();
/**
* 获取声卡信息
*/
void querySoundCardMessage();
/**
* 获取主板信息
*/
void queryBaseboardMessage();
}
3、创建 service 的 impl 实现类
package com.public_wechat.service.impl;
import java.util.List;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import com.public_wechat.service.ComputerComponentService;
import lombok.extern.slf4j.Slf4j;
import oshi.SystemInfo;
import oshi.hardware.*;
/**
* @author : gaogao
* @version 1.0
* @date : 2023-12-14 15:30
*/
@Slf4j
@Service
public class ComputerComponentServiceImpl implements ComputerComponentService {
private static SystemInfo systemInfo = null;
private static HardwareAbstractionLayer infoHardware = null;
static {
systemInfo = new SystemInfo();
infoHardware = systemInfo.getHardware();
}
@Override
public void queryGraphicsCardMessage() {
// 获取显卡信息对象
List<GraphicsCard> graphicsCards = infoHardware.getGraphicsCards();
if (CollectionUtils.isEmpty(graphicsCards)) {
log.info("此计算机未检测到显卡信息!!!");
return;
}
for (int i = 0; i < graphicsCards.size(); i++) {
GraphicsCard card = graphicsCards.get(i);
log.info("显卡 :{}", i + 1);
log.info("制造商:{}", card.getVendor());
log.info("设备名称:{}", card.getName());
log.info("版本:{}", card.getVersionInfo());
log.info("显存大小:{} MB", card.getVRam() / (1024 * 1024));
log.info("设备唯一标识:{}", card.getDeviceId());
log.info("----------------------------------------------------");
}
}
@Override
public void queryMemoryMessage() {
List<PhysicalMemory> physicalMemories = infoHardware.getMemory().getPhysicalMemory();
if (CollectionUtils.isEmpty(physicalMemories)) {
log.info("此计算机未检测到内存条信息!!!");
return;
}
for (int i = 0; i < physicalMemories.size(); i++) {
PhysicalMemory memory = physicalMemories.get(i);
log.info("内存条 :{}", i + 1);
log.info("制造商:{}", memory.getManufacturer());
log.info("内存类型:{}", memory.getMemoryType());
log.info("插槽标识:{}", memory.getBankLabel());
log.info("容量:{} MB", memory.getCapacity() / (1024 * 1024));
log.info("时钟频率:{} MHz", memory.getClockSpeed());
log.info("----------------------------------------------------");
}
}
@Override
public void queryCentralMessage() {
CentralProcessor processor = infoHardware.getProcessor();
log.info("CPU名称:{}", processor.getProcessorIdentifier().getName());
log.info("制造商:{}", processor.getProcessorIdentifier().getVendor());
log.info("家族:{}", processor.getProcessorIdentifier().getFamily());
log.info("型号:{}", processor.getProcessorIdentifier().getModel());
log.info("物理核心数:{}", processor.getPhysicalProcessorCount());
log.info("逻辑核心数:{}", processor.getLogicalProcessorCount());
log.info("频率:{}", processor.getProcessorIdentifier().getVendorFreq());
}
@Override
public void querySoundCardMessage() {
List<SoundCard> soundCards = infoHardware.getSoundCards();
if (CollectionUtils.isEmpty(soundCards)) {
log.info("此计算机未检测到声卡!!!");
return;
}
for (int i = 0; i < soundCards.size(); i++) {
SoundCard card = soundCards.get(i);
log.info("声卡 :{}", i + 1);
log.info("制造商 :{}", card.getCodec());
log.info("型号 :{}", card.getName());
log.info("版本 :{}", card.getDriverVersion());
}
}
@Override
public void queryBaseboardMessage() {
ComputerSystem computerSystem = infoHardware.getComputerSystem();
Baseboard baseboard = computerSystem.getBaseboard();
log.info("制造商 :{}", baseboard.getManufacturer());
log.info("型号 :{}", baseboard.getModel());
log.info("版本号 :{}", baseboard.getVersion());
log.info("序列号 :{}", baseboard.getSerialNumber());
}
}
4、创建测试类,进行单元测试
package com.public_wechat.service;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import lombok.extern.slf4j.Slf4j;
/**
* @author : gaogao
* @version 1.0
* @date : 2023-12-14 15:45
*/
@Slf4j
@SpringBootTest
class ComputerComponentServiceTest {
@Autowired
private ComputerComponentService computerComponentService;
/**
* 输出所有信息
*/
@Test
void queryAll() {
log.info("开始输出显卡信息---------------");
computerComponentService.queryGraphicsCardMessage();
log.info("结束显卡信息---------------");
log.info("开始输出内存条信息---------------");
computerComponentService.queryMemoryMessage();
log.info("结束内存条信息---------------");
log.info("开始输出CPU信息---------------");
computerComponentService.queryCentralMessage();
log.info("结束CPU信息---------------");
log.info("开始输出声卡信息---------------");
computerComponentService.querySoundCardMessage();
log.info("结束声卡信息---------------");
log.info("开始输出主板信息---------------");
computerComponentService.queryBaseboardMessage();
log.info("结束主板信息---------------");
log.info("——————————————————————————");
log.info("| 我是 gaogao |");
log.info("——————————————————————————");
}
/**
* 获取显卡信息
*/
@Test
void queryGraphicsCardMessage() {
computerComponentService.queryGraphicsCardMessage();
}
/**
* 获取内存条信息
*/
@Test
void queryMemoryMessage() {
computerComponentService.queryMemoryMessage();
}
/**
* 获取CPU信息
*/
@Test
void queryCentralMessage() {
computerComponentService.queryCentralMessage();
}
/**
* 获取声卡信息
*/
@Test
void querySoundCardMessage() {
computerComponentService.querySoundCardMessage();
}
/**
* 获取主板信息
*/
@Test
void queryBaseboardMessage() {
computerComponentService.queryBaseboardMessage();
}
}
上述代码已验证完毕,此处忽略结果打印…
总结:
通过上述代码已完成通过java 获取计算机系统和硬件的配置信息。
注意:在使用其他的 oshi
版本时,可能存在获取结果字段增删,但原理是一样的,具体每个版的每个字段含义请查阅 oshi
文档