使用java批量写入环境变量

环境需求

  1. jdk版本:1.8
  2. 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;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/727028.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

少儿编程机器人软件的开发技术

在当今数字化时代&#xff0c;少儿编程教育备受关注&#xff0c;而机器人编程则是其中的一大热门领域。少儿编程机器人软件的开发技术既是挑战&#xff0c;也是机遇。本文将探讨少儿编程机器人软件的开发技术研究&#xff0c;以及实践中的关键问题与解决方案&#xff0c;为开发…

ServletContext

ServletContext 1.共享数据 ServletContext servletContext this.getServletContext(); String username "徐凤年"; servletContext.setAttribute("username",username);ServletContext servletContext this.getServletContext(); String username (…

因果学习篇(2)-Causal Attention for Vision-Language Tasks(文献阅读)

Causal Attention for Vision-Language Tasks 引言 这篇论文是南洋理工大学和澳大利亚莫纳什大学联合发表自2021年的CVPR顶会上的一篇文献&#xff0c;在当前流行的注意力机制中增加了因果推理算法&#xff0c;提出了一种新的注意力机制&#xff1a;因果注意力(CATT)&#xff…

Tongweb7+Tongweb8+Ths6.0.1.0+TongRDS2214 常用指令和初始账号密码(by lqw)

Tongweb7 启动 cd到安装目录的bin目录&#xff0c;执行&#xff1a; sh startservernohup.sh 或./startservernohup.sh 查看日志 cd到安装目录的logs目录&#xff0c;执行&#xff1a; tail -f server.log 关闭 cd到安装目录的bin目录&#xff0c;执行&#xff1a; ./stops…

航芯防护组合拳「MCU+安全」,让数字资产加倍安全!

在这个万物互联的时代&#xff0c;数据安全的“飓风”正在袭来。随着集成电路的广泛应用&#xff0c;安全问题也日益凸显。从芯片漏洞到硬件攻击&#xff0c;这些问题都给集成电路的应用带来了严峻的挑战。一旦安全防线被突破&#xff0c;智能设备的数字资产安全将面临威胁。 …

电动自行车易着火的启示

电动自行车起火情况不时发生&#xff0c;上海雷卯EMC小哥分析原因&#xff0c;或许对您有所启示。 电动自行车容易发生起火的原因可能是由于电池管理系统&#xff08;BMS&#xff09;的保护功能不足或者电池质量问题导致的。要改进BMS的保护功能以减少火灾风险&#xff0c; 可…

【CSP】201403-3-命令行选项

CSP-201403-3-命令行选项 关键点&#xff1a;将整行字符串按空格分割 在解析命令行时&#xff0c;一个常见的需求是将整个命令行字符串分割成多个部分&#xff0c;通常以空格为分隔符。这些部分包括命令行工具的名称、选项&#xff08;可能带有前缀-或--&#xff09;和这些选项…

【算法】KY111日期差值

描述 有两个日期&#xff0c;求两个日期之间的天数&#xff0c;如果两个日期是连续的我们规定他们之间的天数为两天 输入描述&#xff1a; 有多组数据&#xff0c;每组数据有两行&#xff0c;分别表示两个日期&#xff0c;形式为YYYYMMDD 输出描述&#xff1a; 每组数据输出一…

mongodb 图形界面工具 -- Studio 3T(下载、安装、连接mongodb数据库)

目录 mongodb 图形界面工具 -- Studio 3T下载安装第一次使用&#xff1a;注册添加一个连接&#xff08;连接 mongodb 数据库&#xff09;1、点击【添加新连接】&#xff0c;选择【手动配置我的连接设置】2、对 Server 设置连接数据3、连接的用户认证设置&#xff08;创建数据库…

SpringBoot + openGauss开发入门

本文介绍如何快速安装 openGauss 单机版 openGauss 快速环境安装 groupadd dbgroup useradd -g dbgroup omm # 可后面安装时创建 passwd omm #设置密码为Gauss_1234创建安装程序目标目录 mkdir /home/omm/opengauss3 chown -R omm:dbgroup /home/omm/opengauss3下载 openg…

航芯1-Wire安全认证新品上市,防抄板和耗材认证高性价比之选

随着用户产品附加值提升带来的对防抄板的需求&#xff0c;以及电池、医疗耗材、电子配件、IOT领域中对设备认证的需求&#xff0c;上海航芯经过多年的技术积累和对市场的理解&#xff0c;推出了高性价比的ACL16_Axx系列。 1-Wire单总线&#xff1a;小尺寸实现高效传输 ACL16_…

JAVA WEB开发 错误:无效发行版解决办法

1.首先查询本安装的jdk版本 在cmd中输入如下指令 2.打开file——progect structure 2.将这两处保持一致即可

一图看懂:什么是“新质生产力”?

◆2023年9月&#xff0c;首次提出“新质生产力”。 ◆2024年1月&#xff0c;强调“加快发展新质生产力&#xff0c;扎实推进高质量发展”。 ◆2024年3月&#xff0c;《政府工作报告》中提出&#xff0c;要大力推进现代化产业体系建设&#xff0c;加快发展新质生产力。充分发挥…

SpringBoot【问题 05】PostgreSQL数据库启用SSL后使用默认配置进行数据库连接(Navicat工具与Java程序)

官网SSL说明&#xff1a;https://www.postgresql.org/docs/9.1/libpq-ssl.html 1.配置 1.1 文件 使用SSL需要的4个文件&#xff0c;名称要一致&#xff1a; 客户端密钥&#xff1a;postgresql.keyJava客户端密钥&#xff1a;postgresql.pk8客户端证书&#xff1a;postgresq…

iphone解锁的一些方案

如果iPhone被锁定&#xff0c;有以下几种解锁方案可以参考&#xff1a; 使用恢复模式解锁&#xff1a;如果忘记了密码或者屏幕密码输错次数太多导致iPhone被锁定&#xff0c;可以尝试使用恢复模式来解锁。请注意&#xff0c;这将擦除设备上的数据&#xff0c;因此只有在没有其…

shell常用工具和命令

1.printf Format 描述 %s: 一个字符串 %d&#xff0c; %i :一个小数 %f :一个浮点数 %.ns: 输出字符串&#xff0c; n 是输出几个字符 %m.nf :输出浮点数&#xff0c; m 是输出整数位数&#xff0c; n 是输出的小数位数 %x :不带正负号的十六进制&#xff0c;使用 a 至 f 表示…

打开任务管理器的快捷键

打开任务管理器的快捷键通常是Ctrl Shift Esc。只需同时按下这三个键&#xff0c;任务管理器就会立即弹出&#xff0c;显示当前正在运行的进程和性能数据。 此外&#xff0c;还有以下方法可以打开任务管理器&#xff1a; 使用组合键“CtrlAltDelete”&#xff0c;在xp系统中…

Java实战:Redis高可用之主从复制:原理、实战与优化

在高并发、大数据量的场景下&#xff0c;Redis 作为一款高性能的 key-value 存储系统&#xff0c;被广泛应用于缓存、消息队列、分布式锁等领域。为了保证 Redis 的高可用性&#xff0c;我们需要对 Redis 进行主从复制&#xff0c;实现数据的多副本存储。本文将详细介绍 Redis …

阿里云2核4G服务器支持人数并发测试,2核4G主机测评

阿里云2核4G服务器多少钱一年&#xff1f;2核4G配置1个月多少钱&#xff1f;2核4G服务器30元3个月、轻量应用服务器2核4G4M带宽165元一年、企业用户2核4G5M带宽199元一年。可以在阿里云CLUB中心查看 aliyun.club 当前最新2核4G服务器精准报价、优惠券和活动信息。 阿里云官方2…

Vue教学15:组件间的通信:provide/inject与event bus的巧妙应用

大家好&#xff0c;欢迎回到我们的Vue教学系列博客&#xff01;在前十四篇博客中&#xff0c;我们学习了Vue.js的基础知识、安装Node.js与npm、使用Vue Devtools进行调试、Vue实例与生命周期钩子、数据绑定&#xff08;单向与双向&#xff09;、计算属性与侦听器、条件渲染和列…