使用java批量写入环境变量的实现

 更新时间:2024年03月08日 08:31:25   作者:人间花木  
本文主要介绍了使用java批量写入环境变量,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

环境需求

jdk版本:1.8

jna依赖:

        <dependency>
            <groupId>net.java.dev.jna</groupId>
            <artifactId>jna</artifactId>
            <version>5.10.0</version>
        </dependency>
        <dependency>
            <groupId>net.java.dev.jna</groupId>
            <artifactId>jna-platform</artifactId>
            <version>5.10.0</version>
        </dependency>

获取环境变量

    /**
     * 获取指定环境变量的内容,如果该环境变量不存在,则返回null 
     * @param variableName 环境变量名称
     * @return String
     * @version 2.2
     * @author suhuamo
     */
    public static String getEnvironmentVariables(String variableName) {
        // 注册表中环境变量所在位置
        String registryPath = "SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment";
        try {
            return Advapi32Util.registryGetStringValue(WinReg.HKEY_LOCAL_MACHINE, registryPath, variableName);
            // 如果找不到这个环境变量,则会抛出异常
        } catch (Exception e) {
            return null;
        }
    }

重要参数介绍:

registryPath:注册表中环境变量所在位置,即【目前打开的这个文件就是环境变量的注册表文件】

image.png

WinReg.HKEY_LOCAL_MACHINE:环境变量在注册表中的所属组,即

image.png

variableName:需要查找的环境变量的名称,即

image.png

这一列的任意一个。

设置环境变量

    /**
     * 批量写入环境变量 
     * @param systemEnvironmentVariables 需要写入的环境变量,<k:v> 对应 <环境变量名称:环境变量的值>
     * @return void
     * @version 2.2
     * @author suhuamo
     */
    public static void setSystemEnvironmentVariables(Map<String, String> systemEnvironmentVariables){
        // 注册表中环境变量所在位置
        String registryPath = "SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment";
        // 遍历每一组需要写入的环境变量
        for (Map.Entry<String, String> entry : systemEnvironmentVariables.entrySet()) {
            // 将该组环境变量的内容写入注册表文件中
            Advapi32Util.registrySetStringValue(WinReg.HKEY_LOCAL_MACHINE, registryPath, entry.getKey(), entry.getValue());
        }
    }

整合可直接使用的工具类

package org.yscz.aiks;

import com.sun.jna.platform.win32.Advapi32Util;
import com.sun.jna.platform.win32.WinReg;

import java.util.Map;

/**
 * @author suhuamo
 * @slogan 今天的早餐是:早苗的面包、秋子的果酱和观铃的果汁~
 * @date 2024-01-16
 * @description
 * 操作操作系统的工具类
 */
public class OSUtil {
    /**
     * 注册表中环境变量所在位置
     * @version 2.2
     * @author suhuamo
     * @with {@link }
     */
    public static final String registryPath = "SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment";
    /**
     * 批量写入环境变量
     * @param systemEnvironmentVariables 需要写入的环境变量,<k:v> 对应 <环境变量名称:环境变量的值>
     * @return void
     * @version 2.2
     * @author suhuamo
     */
    public static void setSystemEnvironmentVariables(Map<String, String> systemEnvironmentVariables) {
        // 遍历每一组需要写入的环境变量
        for (Map.Entry<String, String> entry : systemEnvironmentVariables.entrySet()) {
            // 将该组环境变量的内容写入注册表文件中
            Advapi32Util.registrySetStringValue(WinReg.HKEY_LOCAL_MACHINE, registryPath, entry.getKey(), entry.getValue());
        }
    }

    /**
     * 获取指定环境变量的内容,如果该环境变量不存在,则返回null
     * @param variableName 环境变量名称
     * @return String
     * @version 2.2
     * @author suhuamo
     */
    public static String getEnvironmentVariables(String variableName) {
        try {
            return Advapi32Util.registryGetStringValue(WinReg.HKEY_LOCAL_MACHINE, registryPath, variableName);
            // 如果找不到这个环境变量,则会抛出异常
        } catch (Exception e) {
            return null;
        }
    }
}

提示:

写入注册表的时候最消耗时间的是读取到注册表文件的句柄,当读取到了之后,写入注册表的耗时不到1毫秒,即如果是写入环境变量,写入1个环境变量的时间和写入100个环境变量的时间消耗时间几乎相同。

写入1个环境变量

package org.yscz.aiks;

import java.util.HashMap;
import java.util.Map;

/**
 * @author suhuamo
 * @slogan 巨人给你鞠躬,是为了让阳光也照射到你。
 * @date 2024-01-16
 * @description
 */
public class Main {
    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        Map<String, String> environmentVariables = new HashMap<>();
        environmentVariables.put("VAR1", "value1");
        OSUtil.setSystemEnvironmentVariables(environmentVariables);
        long end = System.currentTimeMillis();
        System.out.println("当前消耗时间:" + (end - start) + "ms");
    }
}

image.png

写入100个环境变量

package org.yscz.aiks;

import java.util.HashMap;
import java.util.Map;

/**
 * @author suhuamo
 * @slogan 巨人给你鞠躬,是为了让阳光也照射到你。
 * @date 2024-01-16
 * @description
 */
public class Main {
    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        Map<String, String> environmentVariables = new HashMap<>();
        for (int i = 0; i < 100; i++) {
            environmentVariables.put("VAR" + i, "value" + i);
        }
        OSUtil.setSystemEnvironmentVariables(environmentVariables);
        long end = System.currentTimeMillis();
        System.out.println("当前消耗时间:" + (end - start) + "ms");
    }
}

image.png

分析

第一个还慢一点是因为不同时间,电脑的运行内存情况不同,但可以基本上看出效率和写入环境变量的个数无关。

分析for循环中每一次写入注册表的执行速度。

    /**
     * 批量写入环境变量
     * @param systemEnvironmentVariables 需要写入的环境变量,<k:v> 对应 <环境变量名称:环境变量的值>
     * @return void
     * @version 2.2
     * @author suhuamo
     */
    public static void setSystemEnvironmentVariables(Map<String, String> systemEnvironmentVariables) {
        int idx = 0;
        // 遍历每一组需要写入的环境变量
        for (Map.Entry<String, String> entry : systemEnvironmentVariables.entrySet()) {
            long start = System.currentTimeMillis();
            // 将该组环境变量的内容写入注册表文件中
            Advapi32Util.registrySetStringValue(WinReg.HKEY_LOCAL_MACHINE, registryPath, entry.getKey(), entry.getValue());
            long end = System.currentTimeMillis();
            System.out.printf("第%d组环境变量写入完成,耗时%dms%n",++idx, end - start);
        }
    }

输出内容:

输出内容第1组环境变量写入完成,耗时1000ms

第2组环境变量写入完成,耗时0ms

第3组环境变量写入完成,耗时0ms

第4组环境变量写入完成,耗时1ms

第5组环境变量写入完成,耗时0ms

第6组环境变量写入完成,耗时1ms

第7组环境变量写入完成,耗时1ms

第8组环境变量写入完成,耗时1ms

第9组环境变量写入完成,耗时0ms

第10组环境变量写入完成,耗时0ms

第11组环境变量写入完成,耗时0ms

第12组环境变量写入完成,耗时0ms

第13组环境变量写入完成,耗时0ms

第14组环境变量写入完成,耗时0ms

第15组环境变量写入完成,耗时0ms

第16组环境变量写入完成,耗时0ms

第17组环境变量写入完成,耗时0ms

第18组环境变量写入完成,耗时1ms

第19组环境变量写入完成,耗时0ms

第20组环境变量写入完成,耗时0ms

第21组环境变量写入完成,耗时1ms

第22组环境变量写入完成,耗时0ms

第23组环境变量写入完成,耗时0ms

第24组环境变量写入完成,耗时0ms

第25组环境变量写入完成,耗时0ms

第26组环境变量写入完成,耗时0ms

第27组环境变量写入完成,耗时0ms

第28组环境变量写入完成,耗时0ms

第29组环境变量写入完成,耗时1ms

第30组环境变量写入完成,耗时20ms

第31组环境变量写入完成,耗时2ms

第32组环境变量写入完成,耗时1ms

第33组环境变量写入完成,耗时0ms

第34组环境变量写入完成,耗时0ms

第35组环境变量写入完成,耗时1ms

第36组环境变量写入完成,耗时0ms

第37组环境变量写入完成,耗时1ms

第38组环境变量写入完成,耗时1ms

第39组环境变量写入完成,耗时1ms

第40组环境变量写入完成,耗时0ms

第41组环境变量写入完成,耗时0ms

第42组环境变量写入完成,耗时0ms

第43组环境变量写入完成,耗时0ms

第44组环境变量写入完成,耗时1ms

第45组环境变量写入完成,耗时0ms

第46组环境变量写入完成,耗时1ms

第47组环境变量写入完成,耗时0ms

第48组环境变量写入完成,耗时0ms

第49组环境变量写入完成,耗时0ms

第50组环境变量写入完成,耗时0ms

第51组环境变量写入完成,耗时0ms

第52组环境变量写入完成,耗时0ms

第53组环境变量写入完成,耗时0ms

第54组环境变量写入完成,耗时0ms

第55组环境变量写入完成,耗时0ms

第56组环境变量写入完成,耗时0ms

第57组环境变量写入完成,耗时0ms

第58组环境变量写入完成,耗时0ms

第59组环境变量写入完成,耗时0ms

第60组环境变量写入完成,耗时0ms

第61组环境变量写入完成,耗时0ms

第62组环境变量写入完成,耗时0ms

第63组环境变量写入完成,耗时0ms

第64组环境变量写入完成,耗时6ms

第65组环境变量写入完成,耗时1ms

第66组环境变量写入完成,耗时0ms

第67组环境变量写入完成,耗时0ms

第68组环境变量写入完成,耗时0ms

第69组环境变量写入完成,耗时1ms

第70组环境变量写入完成,耗时0ms

第71组环境变量写入完成,耗时0ms

第72组环境变量写入完成,耗时0ms

第73组环境变量写入完成,耗时0ms

第74组环境变量写入完成,耗时0ms

第75组环境变量写入完成,耗时1ms

第76组环境变量写入完成,耗时0ms

第77组环境变量写入完成,耗时0ms

第78组环境变量写入完成,耗时0ms

第79组环境变量写入完成,耗时1ms

第80组环境变量写入完成,耗时0ms

第81组环境变量写入完成,耗时0ms

第82组环境变量写入完成,耗时1ms

第83组环境变量写入完成,耗时0ms

第84组环境变量写入完成,耗时0ms

第85组环境变量写入完成,耗时1ms

第86组环境变量写入完成,耗时0ms

第87组环境变量写入完成,耗时0ms

第88组环境变量写入完成,耗时1ms

第89组环境变量写入完成,耗时0ms

第90组环境变量写入完成,耗时0ms

第91组环境变量写入完成,耗时0ms

第92组环境变量写入完成,耗时1ms

第93组环境变量写入完成,耗时0ms

第94组环境变量写入完成,耗时0ms

第95组环境变量写入完成,耗时1ms

第96组环境变量写入完成,耗时0ms

第97组环境变量写入完成,耗时0ms

第98组环境变量写入完成,耗时0ms

第99组环境变量写入完成,耗时1ms

第100组环境变量写入完成,耗时0ms

当前消耗时间:1118ms

可以看到,只有第一次写入环境变量时很慢,接下来的每一次几乎都没有消耗时间:

image.png

image.png

扩展

另一种写入环境变量的方法,就是通过cmd命令setx name value /M写入环境变量,每一次写入的时间是相同的,100ms~500ms。

    /**
     * 设置环境变量
     * @param variableName
     * @param variableValue
     */
    public static boolean setEnvironmentVariable(String variableName, String variableValue) {
        // 执行 setx 命令来设置环境变量
        try {
            String command = "setx " + variableName + " \"" + variableValue + "\" /M";
            Process process = Runtime.getRuntime().exec(command);

            // 等待命令执行完成
            int exitCode = process.waitFor();

            if (exitCode == 0) {
                log.info("设置:{}环境变量成功,生成内容为:{}", variableName, variableValue);
            } else {
                log.error("设置:{}环境变量失败,生成内容为:{}", variableName, variableValue);
                return false;
            }
        } catch (IOException | InterruptedException e) {
            log.error("设置环境变量时出现异常,异常原因:{}",e.getMessage());
            return false;
        }
        return true;
    }

到此这篇关于使用java批量写入环境变量的实现的文章就介绍到这了,更多相关java批量写入环境变量内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • java数据库操作类演示实例分享(java连接数据库)

    java数据库操作类演示实例分享(java连接数据库)

    java数据库操作类演示实例分享,大家参考使用吧
    2013-12-12
  • Spring基于注解配置AOP详解

    Spring基于注解配置AOP详解

    这篇文章主要介绍了Spring基于注解配置AOP详解,Spring 的 AOP 功能是基于 AspectJ 实现的,支持使用注解声明式定义 AOP 切面,Spring 基于注解配置 AOP 需要启用 AspectJ 自动代理功能,需要的朋友可以参考下
    2023-09-09
  • Java利用反射实现框架类的方法实例

    Java利用反射实现框架类的方法实例

    这篇文章主要给大家介绍了关于Java利用反射实现框架类的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • java 取模与取余的区别说明

    java 取模与取余的区别说明

    这篇文章主要介绍了java 取模与取余的区别说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • JavaWeb连接数据库MySQL的操作技巧

    JavaWeb连接数据库MySQL的操作技巧

    数据库是编程中重要的一部分,它囊括了数据操作,数据持久化等各方面。在每一门编程语言中都占有相当大的比例。本次,小编以MySQL为例,使用mvc编程思想,给大家讲解下javaweb对数据库的操作
    2017-02-02
  • javaweb开发提高效率利器JRebel详解

    javaweb开发提高效率利器JRebel详解

    这篇文章主要介绍了javaweb开发提高效率利器JRebel详解,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • 解决SpringBoot在IDEA中热部署失效问题

    解决SpringBoot在IDEA中热部署失效问题

    热部署是指程序运行过程中实时更新或替换其组件的技术,即项目正在启动中,修改了配置文件中某个值或者添加了某个方法或者修改了某个方法参数,本文给大家介绍了解决SpringBoot在IDEA中热部署失效问题,需要的朋友可以参考下
    2024-01-01
  • 关于Nacos和Eureka的区别及说明

    关于Nacos和Eureka的区别及说明

    这篇文章主要介绍了关于Nacos和Eureka的区别及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • springboot与mybatis整合实例详解

    springboot与mybatis整合实例详解

    这篇文章主要为大家详细介绍了springboot与mybatis整合实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • java 设计模式从风控链理解责任链模式

    java 设计模式从风控链理解责任链模式

    这篇文章主要为大家介绍了java 设计模式从风控链理解责任链模式示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05

最新评论