java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java获取系统信息

Java一键获取(CPU、内存、硬盘、操作系统)系统信息

作者:Full Stack Developme

这篇文章主要为大家详细介绍了如何使用Java一键获取CPU、内存、硬盘、操作系统等系统信息,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下

Java 中获取系统信息(CPU、内存、硬盘、操作系统)主要有以下几种方式:

下面详细介绍每种方法。

一、使用 Java 原生 API

Java 自带的 ManagementFactory 可以获取部分系统信息,但功能有限。

1. 获取操作系统信息

import java.lang.management.ManagementFactory;
import java.lang.management.OperatingSystemMXBean;

public class SystemInfo {
    public static void main(String[] args) {
        OperatingSystemMXBean osBean = ManagementFactory.getOperatingSystemMXBean();
        
        System.out.println("操作系统名称: " + osBean.getName());
        System.out.println("操作系统版本: " + osBean.getVersion());
        System.out.println("操作系统架构: " + osBean.getArch());
        System.out.println("可用处理器核心数: " + osBean.getAvailableProcessors());
        System.out.println("系统平均负载: " + osBean.getSystemLoadAverage());
    }
}

2. 获取内存信息(有限)

import com.sun.management.OperatingSystemMXBean;
import java.lang.management.ManagementFactory;

public class MemoryInfo {
    public static void main(String[] args) {
        OperatingSystemMXBean osBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
        
        // 获取总物理内存(字节)
        long totalMemory = osBean.getTotalPhysicalMemorySize();
        // 获取可用物理内存(字节)
        long freeMemory = osBean.getFreePhysicalMemorySize();
        
        System.out.println("总物理内存: " + formatBytes(totalMemory));
        System.out.println("可用物理内存: " + formatBytes(freeMemory));
        System.out.println("已用物理内存: " + formatBytes(totalMemory - freeMemory));
    }
    
    private static String formatBytes(long bytes) {
        return String.format("%.2f GB", bytes / (1024.0 * 1024.0 * 1024.0));
    }
}

注意com.sun.management.OperatingSystemMXBean 不是标准 API,在不同 JDK 实现中可能不可用。

二、使用 OSHI 库(推荐)

OSHI(Operating System and Hardware Information)是一个跨平台的 Java 库,功能最全面。

1. 添加 Maven 依赖

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

2. 获取 CPU 信息

import oshi.SystemInfo;
import oshi.hardware.CentralProcessor;
import oshi.hardware.HardwareAbstractionLayer;

public class CpuInfo {
    public static void main(String[] args) {
        SystemInfo si = new SystemInfo();
        HardwareAbstractionLayer hal = si.getHardware();
        CentralProcessor cpu = hal.getProcessor();
        
        System.out.println("CPU 名称: " + cpu.getProcessorIdentifier().getName());
        System.out.println("CPU 物理核心数: " + cpu.getPhysicalProcessorCount());
        System.out.println("CPU 逻辑核心数: " + cpu.getLogicalProcessorCount());
        System.out.println("CPU 最大频率: " + cpu.getMaxFreq() / 1_000_000 + " MHz");
        
        // 获取 CPU 使用率
        long[] prevTicks = cpu.getSystemCpuLoadTicks();
        try {
            Thread.sleep(1000); // 等待1秒计算使用率
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        double cpuLoad = cpu.getSystemCpuLoadBetweenTicks(prevTicks) * 100;
        System.out.printf("CPU 使用率: %.2f%%\n", cpuLoad);
    }
}

3. 获取内存信息

import oshi.SystemInfo;
import oshi.hardware.GlobalMemory;
import oshi.hardware.HardwareAbstractionLayer;

public class MemoryInfo {
    public static void main(String[] args) {
        SystemInfo si = new SystemInfo();
        HardwareAbstractionLayer hal = si.getHardware();
        GlobalMemory memory = hal.getMemory();
        
        long total = memory.getTotal();
        long available = memory.getAvailable();
        
        System.out.println("总内存: " + formatBytes(total));
        System.out.println("可用内存: " + formatBytes(available));
        System.out.println("已用内存: " + formatBytes(total - available));
        System.out.println("内存使用率: " + 
            String.format("%.2f%%", (total - available) * 100.0 / total));
        
        // 获取交换空间(虚拟内存)
        System.out.println("总交换空间: " + formatBytes(memory.getVirtualMemory().getSwapTotal()));
        System.out.println("可用交换空间: " + formatBytes(memory.getVirtualMemory().getSwapFree()));
    }
    
    private static String formatBytes(long bytes) {
        return String.format("%.2f GB", bytes / (1024.0 * 1024.0 * 1024.0));
    }
}

4. 获取硬盘信息

import oshi.SystemInfo;
import oshi.hardware.HWDiskStore;
import oshi.hardware.HardwareAbstractionLayer;

import java.util.List;

public class DiskInfo {
    public static void main(String[] args) {
        SystemInfo si = new SystemInfo();
        HardwareAbstractionLayer hal = si.getHardware();
        List<HWDiskStore> diskStores = hal.getDiskStores();
        
        for (HWDiskStore disk : diskStores) {
            System.out.println("硬盘名称: " + disk.getName());
            System.out.println("硬盘型号: " + disk.getModel());
            System.out.println("硬盘序列号: " + disk.getSerial());
            System.out.println("硬盘大小: " + formatBytes(disk.getSize()));
            System.out.println("读取次数: " + disk.getReads());
            System.out.println("写入次数: " + disk.getWrites());
            System.out.println("读取字节数: " + formatBytes(disk.getReadBytes()));
            System.out.println("写入字节数: " + formatBytes(disk.getWriteBytes()));
            System.out.println("----------------------------");
        }
        
        // 获取文件系统信息(分区)
        hal.getFileSystem().getFileStores().forEach(fileStore -> {
            System.out.println("分区: " + fileStore.getVolume());
            System.out.println("挂载点: " + fileStore.getMount());
            System.out.println("总空间: " + formatBytes(fileStore.getTotalSpace()));
            System.out.println("可用空间: " + formatBytes(fileStore.getUsableSpace()));
            System.out.println("已用空间: " + formatBytes(fileStore.getTotalSpace() - fileStore.getUsableSpace()));
            System.out.println("----------------------------");
        });
    }
    
    private static String formatBytes(long bytes) {
        return String.format("%.2f GB", bytes / (1024.0 * 1024.0 * 1024.0));
    }
}

5. 获取操作系统信息

import oshi.SystemInfo;
import oshi.software.os.OperatingSystem;

public class OsInfo {
    public static void main(String[] args) {
        SystemInfo si = new SystemInfo();
        OperatingSystem os = si.getOperatingSystem();
        
        System.out.println("操作系统: " + os.toString());
        System.out.println("操作系统家族: " + os.getFamily());
        System.out.println("操作系统制造商: " + os.getManufacturer());
        System.out.println("操作系统版本: " + os.getVersionInfo());
        System.out.println("进程数: " + os.getProcessCount());
        System.out.println("线程数: " + os.getThreadCount());
        System.out.println("系统启动时间: " + new java.util.Date(os.getSystemBootTime() * 1000));
    }
}

6. 完整示例:获取所有信息

import oshi.SystemInfo;
import oshi.hardware.*;
import oshi.software.os.OperatingSystem;

public class AllSystemInfo {
    public static void main(String[] args) {
        SystemInfo si = new SystemInfo();
        HardwareAbstractionLayer hal = si.getHardware();
        OperatingSystem os = si.getOperatingSystem();
        
        System.out.println("========== 操作系统信息 ==========");
        System.out.println("操作系统: " + os.toString());
        System.out.println("系统启动时间: " + new java.util.Date(os.getSystemBootTime() * 1000));
        
        System.out.println("\n========== CPU信息 ==========");
        CentralProcessor cpu = hal.getProcessor();
        System.out.println("CPU: " + cpu.getProcessorIdentifier().getName());
        System.out.println("物理核心: " + cpu.getPhysicalProcessorCount());
        System.out.println("逻辑核心: " + cpu.getLogicalProcessorCount());
        
        // CPU 使用率
        long[] prevTicks = cpu.getSystemCpuLoadTicks();
        try { Thread.sleep(1000); } catch (InterruptedException e) { }
        System.out.printf("CPU使用率: %.2f%%\n", cpu.getSystemCpuLoadBetweenTicks(prevTicks) * 100);
        
        System.out.println("\n========== 内存信息 ==========");
        GlobalMemory memory = hal.getMemory();
        long totalMem = memory.getTotal();
        long availMem = memory.getAvailable();
        System.out.println("总内存: " + formatBytes(totalMem));
        System.out.println("可用内存: " + formatBytes(availMem));
        System.out.printf("内存使用率: %.2f%%\n", (totalMem - availMem) * 100.0 / totalMem);
        
        System.out.println("\n========== 硬盘信息 ==========");
        hal.getFileSystem().getFileStores().forEach(fs -> {
            System.out.println("分区: " + fs.getMount());
            System.out.println("总空间: " + formatBytes(fs.getTotalSpace()));
            System.out.println("可用空间: " + formatBytes(fs.getUsableSpace()));
            System.out.println("-------------------");
        });
    }
    
    private static String formatBytes(long bytes) {
        String[] units = {"B", "KB", "MB", "GB", "TB"};
        int unitIndex = 0;
        double size = bytes;
        while (size >= 1024 && unitIndex < units.length - 1) {
            size /= 1024;
            unitIndex++;
        }
        return String.format("%.2f %s", size, units[unitIndex]);
    }
}

三、使用 Runtime 执行系统命令

如果不想引入第三方库,可以通过执行系统命令来获取信息。

Windows 示例

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class CommandInfo {
    public static void main(String[] args) {
        // 获取 CPU 信息
        executeCommand("wmic cpu get name");
        
        // 获取内存信息
        executeCommand("wmic memorychip get capacity");
        
        // 获取硬盘信息
        executeCommand("wmic logicaldisk get size,freespace,caption");
    }
    
    private static void executeCommand(String command) {
        try {
            Process process = Runtime.getRuntime().exec(command);
            BufferedReader reader = new BufferedReader(
                new InputStreamReader(process.getInputStream(), "GBK"));
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
            process.waitFor();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Linux 示例

// CPU 信息
executeCommand("cat /proc/cpuinfo | grep 'model name' | head -1");

// 内存信息
executeCommand("cat /proc/meminfo | grep MemTotal");

// 硬盘信息
executeCommand("df -h");

总结

方法优点缺点
Java 原生 API无需额外依赖信息有限,部分 API 非标准
OSHI 库跨平台,信息全面,易于使用需要引入第三方依赖
执行系统命令能获取任意信息平台相关,解析复杂,性能较差

推荐使用 OSHI 库,它封装了底层细节,提供了统一的跨平台 API,能获取最全面的系统信息。

到此这篇关于Java一键获取(CPU、内存、硬盘、操作系统)系统信息的文章就介绍到这了,更多相关Java获取系统信息内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文