使用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,一经查实,立即删除!

相关文章

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…

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

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

电动自行车易着火的启示

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

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

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

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

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

航芯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…

阿里云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…

进制之间的转换

文章目录 编译过程进制转换1、进制的概念1.1 二进制1.2 八进制1.3 十六进制 进制在程序中的表现方式十进制转二进制将十进制转换成二进制&#xff08;除2反序取余法&#xff09;二进制转十进制&#xff08;权值法&#xff09; 八进制转十进制将十进制转换成八进制(除8反序取余法…

医药行业五大难题深度剖析:CRM解决方案助力突围

医疗行业关系着民生、经济乃至战备&#xff0c;是国民经济的重要组成部分。虽然近20年来我国医疗行业年均增长率维持在15%之上&#xff0c;但行业发展仍存在诸多问题。引进CRM管理系统可能是一个行之有效的解决方法。文中将为您整理医疗行业目前的五大挑战&#xff0c;以及CRM如…

Android Termux系统安装openssh实现公网使用SFTP远程访问

文章目录 1. 安装openSSH2. 安装cpolar3. 远程SFTP连接配置4. 远程SFTP访问4. 配置固定远程连接地址 SFTP&#xff08;SSH File Transfer Protocol&#xff09;是一种基于SSH&#xff08;Secure Shell&#xff09;安全协议的文件传输协议。与FTP协议相比&#xff0c;SFTP使用了…

Processing基本形状内容和实例

一、Processing的基本形状内容和实例 1.Processing有一组专门绘制基本图形得图案。像线条这样的基本图形可以被连接起来创建更为复杂得形状&#xff0c;例如一片叶子或者一张脸。 2.为了绘制一条直线&#xff0c;我们需要四个参数&#xff0c;两个用于确定初始位置&#xff0c;…

判断连续数据同意特征的方法:插旗法

bool isMonotonic(int* nums, int numsSize) {int flag 2;for (int i 1; i < numsSize; i) {if (nums[i-1] > nums[i]) {if (flag 0)return false;flag 1;}else if (nums[i-1] < nums[i]) {if (flag 1)return false;flag 0;}}return true; }此代码较为简单&…

Sora:AI视频生成的新机遇与挑战

随着科技的飞速进步&#xff0c;人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;技术已经深入渗透到社会的各个领域。其中&#xff0c;Sora这类基于AI的视频生成工具因其高度逼真的生成能力而备受瞩目。然而&#xff0c;正如一枚硬币有两面&#xff0…

nVisual+AI实现综合布线智能化运维管理

传统的综合布线系统依据TIA-606规范在配线架、跳线、面板上都粘贴了标签&#xff0c;标签作为一个综合布线项目中元器件的唯一标识&#xff0c;对综合布线日常运维管理过程中查询连接关系、定位设备位置至关重要&#xff0c;但标签所能记录的信息毕竟有限&#xff0c;因此可视化…

docker的简单使用

在一些进行使用靶场或者工具的时候&#xff0c;我们可以用docker在线拉取&#xff0c;就可以省去手动搭建靶场的过程 一、docker的配置 因为docker是默认从docker的官网进行拉取&#xff0c;所以拉取经常速度很慢或者失败&#xff0c;我们先要进行一下配置&#xff0c;让他优…

让照片说话唱歌的软件,盘点这3款!

在数字时代&#xff0c;我们总是渴望找到新的方式来表达自我、分享生活。近年来&#xff0c;随着人工智能和图像处理技术的飞速发展&#xff0c;一种新型的软件应运而生&#xff0c;它们能够让照片“说话”甚至“唱歌”&#xff0c;给我们的生活带来了无限乐趣和创意空间。那么…