溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java中怎么通過(guò)oshi獲取系統(tǒng)和硬件信息

發(fā)布時(shí)間:2021-07-01 15:43:19 來(lái)源:億速云 閱讀:1114 作者:Leah 欄目:互聯(lián)網(wǎng)科技

這篇文章將為大家詳細(xì)講解有關(guān)Java中怎么通過(guò)oshi獲取系統(tǒng)和硬件信息,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

Java通過(guò)oshi獲取系統(tǒng)和硬件信息

OSHI是什么

OSHI是一個(gè)基于JNA的免費(fèi)的本地操作系統(tǒng)和Java的硬件信息庫(kù)。
它不需要安裝任何額外的本機(jī)庫(kù),旨在提供跨平臺(tái)的實(shí)現(xiàn)來(lái)檢索系統(tǒng)信息,
如操作系統(tǒng)版本、進(jìn)程、內(nèi)存和CPU使用情況、磁盤和分區(qū)、設(shè)備、傳感器等。

如何使用

添加依賴

        <dependency>
            <groupId>com.github.oshi</groupId>
            <artifactId>oshi-core</artifactId>
            <version>5.3.7</version>
        </dependency>

主要代碼

代碼主要參考

https://github.com/oshi/oshi/blob/master/oshi-core/src/test/java/oshi/SystemInfoTest.java

代碼如下

package com.java.system.tool;

import oshi.hardware.*;
import oshi.software.os.*;
import oshi.util.FormatUtil;

import java.util.Arrays;
import java.util.List;


public class SystemInfo {

    public static void main(String[] args) {

        HardwareAbstractionLayer hardware = OshiTools.getHardware();

        ComputerSystem computerSystem = hardware.getComputerSystem();
        printComputerSystem(computerSystem);

        OperatingSystem os = OshiTools.getOs();
        printOperatingSystem(os);

        FileSystem fileSystem = os.getFileSystem();
        printFileSystem(fileSystem);

        CentralProcessor processor = hardware.getProcessor();
        printProcessor(processor);

        GlobalMemory memory = hardware.getMemory();
        printMemory(memory);

        List<OSProcess> processes = os.getProcesses(5, OperatingSystem.ProcessSort.CPU);
        printOSProcess(processes,memory);

        List<HWDiskStore> diskStores = hardware.getDiskStores();
        printDiskStores(diskStores);

        List<NetworkIF> networkIFs = hardware.getNetworkIFs();
        printNetworkInterfaces(networkIFs);

        NetworkParams networkParams = os.getNetworkParams();
        printNetworkParameters(networkParams);

        List<UsbDevice> usbDevices = hardware.getUsbDevices(true);
        printUsbDevices(usbDevices);

        Sensors sensors = hardware.getSensors();
        printSensors(sensors);

        List<PowerSource> powerSources = hardware.getPowerSources();
        printPowerSources(powerSources);

        List<Display> displays = hardware.getDisplays();
        printDisplay(displays);
    }




    public static void printComputerSystem(ComputerSystem computerSystem) {
        Firmware firmware = computerSystem.getFirmware();
        Baseboard baseboard = computerSystem.getBaseboard();
        printTools.printAll("硬件環(huán)境", Arrays.asList("硬件制造商", "硬件型號(hào)", "硬件編碼"), Arrays.asList(computerSystem.getManufacturer(), computerSystem.getModel(), computerSystem.getSerialNumber()));
        printTools.printAll("固件信息", Arrays.asList("固件制造商", "固件名稱", "固件版本", "固件說(shuō)明", "固件日期"), Arrays.asList(firmware.getManufacturer(), firmware.getName(), firmware.getVersion(), firmware.getDescription(), firmware.getReleaseDate()));
        printTools.printAll("主板信息", Arrays.asList("主板制造商", "主板型號(hào)", "主板版本", "主板編碼"), Arrays.asList(baseboard.getManufacturer(), baseboard.getModel(), baseboard.getVersion(), baseboard.getSerialNumber()));
    }

    public static void printOperatingSystem(OperatingSystem os) {
        printTools.printAll("操作系統(tǒng)", Arrays.asList("操作系統(tǒng)制造商", "操作系統(tǒng)", "操作系統(tǒng)進(jìn)程數(shù)", "操作系統(tǒng)線程數(shù)", "操作系統(tǒng)開始時(shí)間", "操作系統(tǒng)位數(shù)", "操作系統(tǒng)結(jié)束時(shí)間"), Arrays.asList(os.getManufacturer(), String.valueOf(os.getFamily()), String.valueOf(os.getProcessCount()), String.valueOf(os.getThreadCount()), String.valueOf(os.getSystemBootTime()), String.valueOf(os.getBitness()), String.valueOf(os.getSystemUptime())));
    }

    public static void printProcessor(CentralProcessor centralProcessor) {
        List<String> keys = Arrays.asList("cpu數(shù)量", "cpu核心數(shù)", "cpu線程數(shù)", "cpu編號(hào)");
        List<String> values = Arrays.asList(String.valueOf(centralProcessor.getPhysicalPackageCount()), String.valueOf(centralProcessor.getPhysicalProcessorCount()), String.valueOf(centralProcessor.getLogicalProcessorCount()), String.valueOf(centralProcessor.getProcessorIdentifier()));
        printTools.printAll("中央處理器", keys, values);
    }

    public static void printMemory(GlobalMemory memory) {
        List<String> keys = Arrays.asList("內(nèi)存大小", "可用內(nèi)存大小");
        List<String> values = Arrays.asList(FormatUtil.formatBytes(memory.getTotal()), FormatUtil.formatBytes(memory.getAvailable()));
        printTools.printAll("內(nèi)存", keys, values);
        List<PhysicalMemory> memoryList = memory.getPhysicalMemory();
        memoryList.forEach((item) -> {
            List<String> keyList = Arrays.asList("內(nèi)存型號(hào)", "內(nèi)存規(guī)格", "內(nèi)存主頻", "內(nèi)存大小");
            List<String> valueList = Arrays.asList(item.getManufacturer(), item.getMemoryType(), FormatUtil.formatBytes(item.getClockSpeed()), FormatUtil.formatBytes(item.getCapacity()));
            printTools.printAll("內(nèi)存條信息", keyList, valueList);
        });
    }

    public static void printUsbDevices(List<UsbDevice> usbDeviceList) {
        usbDeviceList.forEach((item) -> {
//            List<String> keyList = Arrays.asList("Usb驅(qū)動(dòng)名稱", "Usb產(chǎn)品ID", "Usb編碼", "Usb唯一設(shè)備號(hào)", "Usb供應(yīng)商", "UsbUsb供應(yīng)商ID");
//            List<String> valueList = Arrays.asList(item.getName(), item.getProductId(), item.getSerialNumber(), item.getUniqueDeviceId(), item.getVendor(), item.getVendorId());
            List<String> keyList = Arrays.asList("Usb驅(qū)動(dòng)");
            List<String> valueList = Arrays.asList(item.toString());
            printTools.printAll("Usb驅(qū)動(dòng)信息", keyList, valueList);
        });
    }

    private static void printFileSystem(FileSystem fileSystem) {
        List<OSFileStore> fileStores = fileSystem.getFileStores();
        fileStores.forEach((item) -> {
            List<String> keyList = Arrays.asList("名稱", "UUID", "盤符", "文件類型", "總大小", "剩余大小", "使用比例%");
            List<String> valueList = Arrays.asList(item.getName(), item.getUUID(), item.getMount(), item.getType(), FormatUtil.formatBytes(item.getTotalSpace()), FormatUtil.formatBytes(item.getUsableSpace()), String.valueOf(100d * item.getUsableSpace() / item.getTotalSpace()));
            printTools.printAll("文件存儲(chǔ)", keyList, valueList);
        });
    }

    private static void printDiskStores(List<HWDiskStore> diskList) {
        diskList.forEach((item) -> {
            List<String> keyList = Arrays.asList("名稱", "型號(hào)", "序號(hào)", "大小");
            List<String> valueList = Arrays.asList(item.getName(), item.getModel(), item.getSerial(), FormatUtil.formatBytes(item.getSize()));
            printTools.printAll("磁盤存儲(chǔ)", keyList, valueList);
            List<HWPartition> partitions = item.getPartitions();
            partitions.forEach(e->{
                List<String> keyLists = Arrays.asList("分區(qū)名稱", "分區(qū)類型", "分區(qū)大小");
                List<String> valueLists = Arrays.asList(e.getName(), e.getType(),FormatUtil.formatBytesDecimal(e.getSize()));
                printTools.printAll("磁盤分區(qū)", keyLists, valueLists);
            });
        });
    }

    private static void printNetworkInterfaces(List<NetworkIF> networkIFs) {
        networkIFs.forEach((item) -> {
            List<String> keyList = Arrays.asList("名稱", "MAC", "MTU", "網(wǎng)速bps", "IPv4", "IPv6");
            List<String> valueList = Arrays.asList(item.getName(), item.getMacaddr(),
                    String.valueOf(item.getMTU()), FormatUtil.formatValue(item.getSpeed(), "bps"), Arrays.toString(item.getIPv4addr()), Arrays.toString(item.getIPv6addr()));
            printTools.printAll("網(wǎng)絡(luò)設(shè)置", keyList, valueList);
        });
    }

    private static void printNetworkParameters(NetworkParams networkParams) {
        List<String> keyList = Arrays.asList("Host", "Domain", "DNS", "IPv4", "IPv6");
        List<String> valueList = Arrays.asList(networkParams.getHostName(), networkParams.getDomainName(),
                Arrays.toString(networkParams.getDnsServers()), networkParams.getIpv4DefaultGateway()
                , networkParams.getIpv6DefaultGateway());
        printTools.printAll("網(wǎng)絡(luò)", keyList, valueList);
    }

    private static void printSensors(Sensors sensors) {
        List<String> keyList = Arrays.asList("CPU溫度", "風(fēng)扇", "CPU電壓");
        List<String> valueList = Arrays.asList(String.valueOf(sensors.getCpuTemperature()),
                Arrays.toString(sensors.getFanSpeeds()), String.valueOf(sensors.getCpuVoltage()));
        printTools.printAll("傳感器", keyList, valueList);
    }

    private static void printPowerSources(List<PowerSource> powerSources) {
        powerSources.stream().forEach(item -> {
            List<String> keyList = Arrays.asList("電源名稱", "剩余百分比");
            List<String> valueList = Arrays.asList(item.getName(), String.valueOf(item.getRemainingCapacityPercent()*100));
            printTools.printAll("電源", keyList, valueList);
        });
    }

    private static void printDisplay(List<Display> displays) {
        displays.stream().forEach(item -> {
            List<String> keyList = Arrays.asList("顯示");
            List<String> valueList = Arrays.asList(item.toString());
            printTools.printAll("顯示", keyList, valueList);
        });
    }


    private static void printOSProcess(List<OSProcess> processes,GlobalMemory memory) {
        processes.stream().forEach(item -> {
            List<String> keyList = Arrays.asList("PID","CPU","MEM","VSZ","RSS Name");
            List<String> valueList = Arrays.asList(String.valueOf(item.getProcessID()),String.valueOf(100d * (item.getKernelTime() + item.getUserTime()) / item.getUpTime()),
            String.valueOf(100d * item.getResidentSetSize() / memory.getTotal()),FormatUtil.formatBytes(item.getVirtualSize()),
                            FormatUtil.formatBytes(item.getResidentSetSize()),item.getName());
            printTools.printAll("進(jìn)程ID", keyList, valueList);
        });
    }
}

進(jìn)階

圖形化界面參考

oshi-demo

oshi的監(jiān)控指標(biāo)

1、計(jì)算機(jī)系統(tǒng)和固件,底板
2、操作系統(tǒng)和版本/內(nèi)部版本
3、物理(核心)和邏輯(超線程)CPU,處理器組,NUMA節(jié)點(diǎn)
4、系統(tǒng)和每個(gè)處理器的負(fù)載百分比和滴答計(jì)數(shù)器
5、CPU正常運(yùn)行時(shí)間,進(jìn)程和線程
6、進(jìn)程正常運(yùn)行時(shí)間,CPU,內(nèi)存使用率,用戶/組,命令行
7、已使用/可用的物理和虛擬內(nèi)存
8、掛載的文件系統(tǒng)(類型,可用空間和總空間)
9、磁盤驅(qū)動(dòng)器(型號(hào),序列號(hào),大?。┖头謪^(qū)
10、網(wǎng)絡(luò)接口(IP,帶寬輸入/輸出)
11、電池狀態(tài)(電量百分比,剩余時(shí)間,電量使用情況統(tǒng)計(jì)信息)
12、連接的顯示器(帶有EDID信息)
13、USB設(shè)備
14、傳感器(溫度,風(fēng)扇速度,電壓)

關(guān)于Java中怎么通過(guò)oshi獲取系統(tǒng)和硬件信息就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI