java获取机器码简单实现demo

 更新时间:2023年11月21日 10:45:44   作者:初窥门径  
这篇文章主要为大家介绍了java获取机器码的简单实现demo,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

java获取机器码

import cn.hutool.crypto.digest.DigestUtil;
import com.alibaba.fastjson.JSON;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.Scanner;
/**
 * @author shanjunpeng
 * @date 2023/9/27
 */
public class MachineCodeUtils {
    public static final String WINDOWS = "Windows";
    public static final String LINUX = "Linux";
    /**
     * 获取机器码
     */
    public static String getMachineCode() {
        return getMachineCode(getOS());
    }
    /**
     * 获取操作系统
     * @return
     */
    public static String getOS() {
        String os = System.getProperty("os.name").toLowerCase();
        if (os.contains("win")) {
            return WINDOWS;
        } else if (os.contains("nix") || os.contains("nux") || os.contains("aix")) {
            return LINUX;
        } else if (os.contains("mac")) {
            return "Mac OS";
        } else if (os.contains("sunos")) {
            return "Solaris";
        } else {
            return "Unknown";
        }
    }
    public static String getMachineCode(String type) {
        if (Objects.isNull(type)) {
            return "";
        }
        Map<String, Object> codeMap = new HashMap<>(2);
        String result = "";
        if (LINUX.equals(type)) {
            String boisVersion = getBoisVersion();
            codeMap.put("boisVersion", boisVersion);
            System.out.println("boisVersion:" + boisVersion);
            String uuid = getUUID();
            codeMap.put("uuid", uuid);
            System.out.println("uuid:" + uuid);
        } else if (WINDOWS.equals(type)) {
            String processorId = getCPUSerialNumber();
            codeMap.put("ProcessorId", processorId);
            System.out.println("ProcessorId:" + processorId);
            String serialNumber = getHardDiskSerialNumber();
            codeMap.put("SerialNumber", serialNumber);
            System.out.println("SerialNumber:" + serialNumber);
        }else{
            return "";
        }
        String codeMapStr = JSON.toJSONString(codeMap);
        String serials = DigestUtil.md5Hex(codeMapStr);
        result = getSplitString(serials, "-", 4);
        return result.toUpperCase();
    }
    public static String getSplitString(String str, String joiner, int number) {
        StringBuilder sb = new StringBuilder();
        int len = str.length();
        for (int i = 0; i < len; i += number) {
            if (i + number <= len) {
                sb.append(str, i, i + number);
            } else {
                sb.append(str.substring(i));
            }
            if (i + number < len) {
                sb.append(joiner);
            }
        }
        return sb.toString();
    }
    /**
     * 获取CPU序列号
     *
     * @return
     * @throws IOException
     */
    public static String getCPUSerialNumber() {
        String next;
        try {
            Process process = Runtime.getRuntime().exec(new String[]{"wmic", "cpu", "get", "ProcessorId"});
            process.getOutputStream().close();
            Scanner sc = new Scanner(process.getInputStream());
            String serial = sc.next();
            next = sc.next();
        } catch (IOException e) {
            throw new RuntimeException("获取CPU序列号失败");
        }
        return next;
    }
    /**
     * 获取 硬盘序列号(Windows)
     *
     * @return
     * @throws IOException
     * @throws InterruptedException
     */
    public static String getHardDiskSerialNumber() {
        try {
            Process process = Runtime.getRuntime().exec(new String[]{"wmic", "path", "win32_physicalmedia", "get", "serialnumber"});
            process.getOutputStream().close();
            Scanner sc = new Scanner(process.getInputStream());
            String serial = sc.next();
            return sc.next();
        } catch (IOException e) {
            throw new RuntimeException("获取硬盘序列号失败");
        }
    }
    /**
     * 获取系统序列号(linux)
     *
     * @return
     */
    public static String getUUID() {
        String result = "";
        try {
            Process process = Runtime.getRuntime().exec("sudo dmidecode -s system-uuid");
            InputStream in;
            BufferedReader br;
            in = process.getInputStream();
            br = new BufferedReader(new InputStreamReader(in));
            while (in.read() != -1) {
                result = br.readLine();
            }
            br.close();
            in.close();
            process.destroy();
            System.out.println("获取序列号:" + result);
        } catch (Throwable e) {
            e.printStackTrace();
        }
        return result;
    }
    /**
     * bois版本号(linux)
     *
     * @return
     */
    public static String getBoisVersion() {
        String result = "";
        Process p;
        try {
            // 管道
            p = Runtime.getRuntime().exec("sudo dmidecode -s bios-version");
            BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
            String line;
            while ((line = br.readLine()) != null) {
                result += line;
                break;
            }
            br.close();
        } catch (IOException e) {
            System.out.println("获取主板信息错误");
        }
        return result;
    }
}

以上就是java获取机器码实现demo的详细内容,更多关于java获取机器码的资料请关注脚本之家其它相关文章!

相关文章

  • 老生常谈Java 网络编程 —— Socket 详解

    老生常谈Java 网络编程 —— Socket 详解

    这篇文章主要介绍了Java 网络编程 —— Socket 相关知识,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • Java中的WeakHashMap简析

    Java中的WeakHashMap简析

    这篇文章主要介绍了Java中的WeakHashMap简析,Map 的子类常见的有 HashMap、Hashtable、ConcurrentHashMap、LinkedHashMap 等,WeakHashMap,直译就是,虚弱的 HashMap,从名字可得知其和 HashMap 有关,需要的朋友可以参考下
    2023-09-09
  • 一文详解如何在idea中快速搭建一个Spring Boot项目

    一文详解如何在idea中快速搭建一个Spring Boot项目

    IntelliJ IDEA作为Java开发者的‌首选IDE‌,深度集成Spring Boot支持,可一键生成项目骨架、智能配置依赖,这篇文章主要介绍了如何在idea中快速搭建一个Spring Boot项目的相关资料,需要的朋友可以参考下
    2025-06-06
  • SpringBoot IOC容器初始化的全流程

    SpringBoot IOC容器初始化的全流程

    Spring Boot IOC初始化流程核心在AbstractApplicationContext.refresh方法中,依次完成BeanFactory准备、后置处理器执行、Bean加载、Tomcat启动及缓存清理,最终实现容器启动与Bean实例化
    2025-09-09
  • 解决Process.getInputStream()阻塞的问题

    解决Process.getInputStream()阻塞的问题

    这篇文章主要介绍了解决Process.getInputStream()阻塞的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Java统计字符串中英文字母、空格、数字和其它字符的个数

    Java统计字符串中英文字母、空格、数字和其它字符的个数

    在日常编程中,我们经常需要处理字符串数据,本文将介绍如何使用Java语言来实现一个简单的程序,可以接收用户输入的一行字符,并分别统计出其中英文字母、空格、数字和其他字符的个数,希望对大家有所帮助
    2026-01-01
  • Spring Boot统一返回体的踩坑记录

    Spring Boot统一返回体的踩坑记录

    这篇文章主要给大家介绍了关于Spring Boot统一返回体踩坑的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • SpringBoot中dubbo+zookeeper实现分布式开发的应用详解

    SpringBoot中dubbo+zookeeper实现分布式开发的应用详解

    这篇文章主要介绍了SpringBoot中dubbo+zookeeper实现分布式开发的应用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • mybatis 使用jdbc.properties文件设置不起作用的解决方法

    mybatis 使用jdbc.properties文件设置不起作用的解决方法

    这篇文章主要介绍了mybatis 使用jdbc.properties文件设置不起作用的解决方法,需要的朋友可以参考下
    2018-03-03
  • Maven项目中出现“非法字符: 65279”错误的解决办法

    Maven项目中出现“非法字符: 65279”错误的解决办法

    在使用Maven进行项目构建时,有时会遇到一些意想不到的问题,其中一个常见的问题是遇到非法字符 ​​65279​​,这个字符通常被称为零宽度无断行空格(Zero-width no-break space),本文将详细介绍如何识别和解决这个问题,需要的朋友可以参考下
    2025-12-12

最新评论