Java获取系统信息案例

wen java案例 1

本文目录导读:

Java获取系统信息案例

  1. 基础系统属性获取
  2. 内存信息获取
  3. 使用第三方库获取详细系统信息
  4. 获取网络和运行时信息
  5. 配置文件示例
  6. 完整的系统监控类
  7. 使用建议

我来为您提供几个Java获取系统信息的实用案例,包括CPU、内存、磁盘、操作系统等信息的获取方法。

基础系统属性获取

import java.util.Properties;
import java.util.Map;
public class SystemInfoDemo {
    public static void main(String[] args) {
        // 获取系统属性
        Properties props = System.getProperties();
        System.out.println("===== 系统基本信息 =====");
        System.out.println("操作系统名称: " + System.getProperty("os.name"));
        System.out.println("操作系统版本: " + System.getProperty("os.version"));
        System.out.println("操作系统架构: " + System.getProperty("os.arch"));
        System.out.println("Java版本: " + System.getProperty("java.version"));
        System.out.println("Java虚拟机版本: " + System.getProperty("java.vm.version"));
        System.out.println("Java厂商: " + System.getProperty("java.vendor"));
        System.out.println("用户名称: " + System.getProperty("user.name"));
        System.out.println("用户主目录: " + System.getProperty("user.home"));
        System.out.println("当前工作目录: " + System.getProperty("user.dir"));
        System.out.println("文件分隔符: " + System.getProperty("file.separator"));
        System.out.println("路径分隔符: " + System.getProperty("path.separator"));
        System.out.println("行分隔符: " + System.getProperty("line.separator"));
    }
}

内存信息获取

public class MemoryInfoDemo {
    public static void main(String[] args) {
        // 获取运行时对象
        Runtime runtime = Runtime.getRuntime();
        // 设置最大内存(可选)
        // runtime.maxMemory();
        System.out.println("===== 内存信息 =====");
        // 最大可用内存
        long maxMemory = runtime.maxMemory();
        System.out.println("最大可用内存: " + formatSize(maxMemory));
        // 已分配内存
        long totalMemory = runtime.totalMemory();
        System.out.println("已分配内存: " + formatSize(totalMemory));
        // 已分配内存中的空闲空间
        long freeMemory = runtime.freeMemory();
        System.out.println("空闲内存: " + formatSize(freeMemory));
        // 已使用内存
        long usedMemory = totalMemory - freeMemory;
        System.out.println("已使用内存: " + formatSize(usedMemory));
        // 内存使用率
        double usageRatio = (double) usedMemory / maxMemory * 100;
        System.out.printf("内存使用率: %.2f%%%n", usageRatio);
        // 可用的处理器核心数
        int processors = runtime.availableProcessors();
        System.out.println("CPU核心数: " + processors);
    }
    // 格式化内存大小
    private static String formatSize(long bytes) {
        if (bytes < 1024) return bytes + " B";
        int exp = (int) (Math.log(bytes) / Math.log(1024));
        String pre = "KMGTPE".charAt(exp-1) + "";
        return String.format("%.2f %sB", bytes / Math.pow(1024, exp), pre);
    }
}

使用第三方库获取详细系统信息

1 OSHI库(推荐)

首先添加Maven依赖:

<dependency>
    <groupId>com.github.oshi</groupId>
    <artifactId>oshi-core</artifactId>
    <version>6.4.0</version>
</dependency>
import oshi.SystemInfo;
import oshi.hardware.*;
import oshi.software.os.*;
import java.util.List;
public class OSHISystemInfo {
    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("系统版本: " + os.getVersionInfo());
        System.out.println("系统架构: " + System.getProperty("os.arch"));
        // CPU信息
        CentralProcessor processor = hal.getProcessor();
        System.out.println("\n===== CPU信息 =====");
        System.out.println("CPU型号: " + processor.getProcessorIdentifier().getName());
        System.out.println("物理核心数: " + processor.getPhysicalProcessorCount());
        System.out.println("逻辑核心数: " + processor.getLogicalProcessorCount());
        // CPU使用率
        double[] load = processor.getSystemLoadAverage(1);
        System.out.println("系统负载: " + load[0]);
        // 内存信息
        GlobalMemory memory = hal.getMemory();
        System.out.println("\n===== 内存信息 =====");
        System.out.println("总内存: " + formatBytes(memory.getTotal()));
        System.out.println("可用内存: " + formatBytes(memory.getAvailable()));
        System.out.println("已使用内存: " + formatBytes(memory.getTotal() - memory.getAvailable()));
        // 磁盘信息
        List<HWDiskStore> diskStores = hal.getDiskStores();
        System.out.println("\n===== 磁盘信息 =====");
        for (HWDiskStore disk : diskStores) {
            System.out.println("磁盘名称: " + disk.getName());
            System.out.println("磁盘大小: " + formatBytes(disk.getSize()));
            System.out.println("读取速率: " + disk.getReadBytes() + " bytes");
            System.out.println("写入速率: " + disk.getWriteBytes() + " bytes");
            System.out.println("---");
        }
        // 网络信息
        List<NetworkIF> networkIFs = hal.getNetworkIFs();
        System.out.println("\n===== 网络信息 =====");
        for (NetworkIF net : networkIFs) {
            System.out.println("网卡名称: " + net.getName());
            System.out.println("显示名称: " + net.getDisplayName());
            System.out.println("MAC地址: " + net.getMacaddr());
            System.out.println("IPv4地址: " + String.join(", ", net.getIPv4addr()));
            System.out.println("IPv6地址: " + String.join(", ", net.getIPv6addr()));
            System.out.println("---");
        }
    }
    private static String formatBytes(long bytes) {
        if (bytes < 1024) return bytes + " B";
        int exp = (int) (Math.log(bytes) / Math.log(1024));
        String pre = "KMGTPE".charAt(exp-1) + "";
        return String.format("%.2f %sB", bytes / Math.pow(1024, exp), pre);
    }
}

2 SIGAR库

添加依赖:

<dependency>
    <groupId>org.fusesource</groupId>
    <artifactId>sigar</artifactId>
    <version>1.6.4</version>
</dependency>
import org.hyperic.sigar.*;
import org.hyperic.sigar.cpu.CpuInfo;
import org.hyperic.sigar.cpu.CpuPerc;
import org.hyperic.sigar.mem.Mem;
public class SigarSystemInfo {
    private static Sigar sigar;
    public static void main(String[] args) {
        try {
            sigar = new Sigar();
            getSystemInfo();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void getSystemInfo() throws Exception {
        // CPU信息
        System.out.println("===== CPU信息 =====");
        CpuInfo[] cpuInfos = sigar.getCpuInfoList();
        for (CpuInfo cpuInfo : cpuInfos) {
            System.out.println("CPU型号: " + cpuInfo.getModel());
            System.out.println("主频: " + cpuInfo.getMhz() + " MHz");
            System.out.println("核心数: " + cpuInfo.getTotalCores());
        }
        // CPU使用率
        CpuPerc cpuPerc = sigar.getCpuPerc();
        System.out.println("CPU使用率: " + (cpuPerc.getCombined() * 100) + "%");
        // 内存信息
        System.out.println("\n===== 内存信息 =====");
        Mem mem = sigar.getMem();
        System.out.println("总内存: " + formatSize(mem.getTotal()));
        System.out.println("已使用: " + formatSize(mem.getUsed()));
        System.out.println("可用: " + formatSize(mem.getFree()));
        System.out.println("内存使用率: " + (mem.getUsedPercent()) + "%");
        // 交换分区
        System.out.println("\n===== 交换分区 =====");
        Swap swap = sigar.getSwap();
        System.out.println("总交换空间: " + formatSize(swap.getTotal()));
        System.out.println("已使用: " + formatSize(swap.getUsed()));
        System.out.println("可用: " + formatSize(swap.getFree()));
        // 文件系统信息
        System.out.println("\n===== 文件系统 =====");
        FileSystem[] fileSystems = sigar.getFileSystemList();
        for (FileSystem fs : fileSystems) {
            System.out.println("文件系统: " + fs.getDevName());
            System.out.println("挂载点: " + fs.getDirName());
            System.out.println("类型: " + fs.getSysTypeName());
            System.out.println("---");
        }
    }
    private static String formatSize(long size) {
        if (size < 1024) return size + " B";
        int exp = (int) (Math.log(size) / Math.log(1024));
        String pre = "KMGTPE".charAt(exp-1) + "";
        return String.format("%.2f %sB", size / Math.pow(1024, exp), pre);
    }
}

获取网络和运行时信息

import java.net.*;
import java.util.Enumeration;
public class NetworkInfoDemo {
    public static void main(String[] args) {
        try {
            System.out.println("===== 网络信息 =====");
            // 获取本机IP地址
            InetAddress localHost = InetAddress.getLocalHost();
            System.out.println("主机名: " + localHost.getHostName());
            System.out.println("本机IP: " + localHost.getHostAddress());
            // 获取所有网络接口
            Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
            while (interfaces.hasMoreElements()) {
                NetworkInterface ni = interfaces.nextElement();
                System.out.println("\n网络接口: " + ni.getName());
                System.out.println("显示名称: " + ni.getDisplayName());
                System.out.println("是否启用: " + ni.isUp());
                System.out.println("是否回环: " + ni.isLoopback());
                // 获取MAC地址
                byte[] mac = ni.getHardwareAddress();
                if (mac != null) {
                    StringBuilder sb = new StringBuilder();
                    for (int i = 0; i < mac.length; i++) {
                        sb.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : ""));
                    }
                    System.out.println("MAC地址: " + sb.toString());
                }
                // 获取IP地址
                Enumeration<InetAddress> addresses = ni.getInetAddresses();
                while (addresses.hasMoreElements()) {
                    InetAddress addr = addresses.nextElement();
                    System.out.println("IP地址: " + addr.getHostAddress());
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

配置文件示例

import java.io.*;
import java.util.Properties;
public class SystemConfigUtil {
    private Properties props;
    public SystemConfigUtil(String configPath) {
        props = new Properties();
        try (InputStream input = new FileInputStream(configPath)) {
            props.load(input);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public void printSystemConfig() {
        System.out.println("===== 系统配置信息 =====");
        System.out.println("应用名称: " + props.getProperty("app.name"));
        System.out.println("应用版本: " + props.getProperty("app.version"));
        System.out.println("运行环境: " + props.getProperty("env"));
        System.out.println("数据库地址: " + props.getProperty("db.url"));
        System.out.println("数据库用户: " + props.getProperty("db.username"));
        // 获取环境变量
        System.out.println("\n===== 环境变量 =====");
        System.getenv().forEach((key, value) -> {
            System.out.println(key + ": " + value);
        });
    }
}

完整的系统监控类

import java.lang.management.*;
import java.util.Map;
public class SystemMonitor {
    public static void main(String[] args) throws Exception {
        SystemMonitor monitor = new SystemMonitor();
        while (true) {
            monitor.printSystemStatus();
            Thread.sleep(5000); // 每5秒刷新一次
            System.out.println("--------------------------------");
        }
    }
    public void printSystemStatus() {
        // 内存使用
        MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean();
        MemoryUsage heapUsage = memoryBean.getHeapMemoryUsage();
        System.out.println("===== 系统状态监控 =====");
        System.out.printf("堆内存: 已用 %d MB / 最大 %d MB%n", 
            heapUsage.getUsed() / 1024 / 1024, 
            heapUsage.getMax() / 1024 / 1024);
        // 线程信息
        ThreadMXBean threadBean = ManagementFactory.getThreadMXBean();
        System.out.println("线程数: " + threadBean.getThreadCount());
        System.out.println("峰值线程数: " + threadBean.getPeakThreadCount());
        System.out.println("守护线程数: " + threadBean.getDaemonThreadCount());
        // CPU使用率
        OperatingSystemMXBean osBean = ManagementFactory.getOperatingSystemMXBean();
        System.out.println("CPU核心数: " + osBean.getAvailableProcessors());
        System.out.println("系统负载: " + osBean.getSystemLoadAverage());
        // 类加载信息
        ClassLoadingMXBean classBean = ManagementFactory.getClassLoadingMXBean();
        System.out.println("已加载类数: " + classBean.getLoadedClassCount());
        System.out.println("已卸载类数: " + classBean.getUnloadedClassCount());
        // GC信息
        for (GarbageCollectorMXBean gcBean : ManagementFactory.getGarbageCollectorMXBeans()) {
            System.out.println("GC " + gcBean.getName() + " 次数: " + gcBean.getCollectionCount());
            System.out.println("GC " + gcBean.getName() + " 时间: " + gcBean.getCollectionTime() + "ms");
        }
    }
}

使用建议

  1. 简单场景:使用 System.getProperty()Runtime
  2. 详细硬件信息:使用 OSHI 库
  3. 跨平台兼容:注意不同操作系统的差异
  4. 性能监控:使用 java.lang.management
  5. 生产环境:建议封装成服务,定时采集数据

这些示例覆盖了大多数系统信息获取的需求,您可以根据具体场景选择合适的方案。

抱歉,评论功能暂时关闭!