使用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.hqwc.cn/news/519590.html

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

相关文章

培训机构新助力:教务管理工教务管理新境界:完善流程,高效运营触手可及具

随着科技的不断进步&#xff0c;教育领域正迎来一场革命性的变革。乔拓云教育系统&#xff0c;作为这场变革的引领者&#xff0c;正以其卓越的功能和高效的解决方案&#xff0c;为培训机构带来前所未有的教务管理新篇章。 一、高效排课&#xff0c;让教务管理更轻松 乔拓云教育…

模型部署——rknn-toolkit-lite2部署RKNN模型到开发板上(python版)

在RKNN模型部署前&#xff0c;需要注意以下几点&#xff1a; &#xff08;1&#xff09;硬件平台兼容性: 确保你的开发板与 RKNN Toolkit Lite2 兼容。目前&#xff0c;RKNN Toolkit Lite2 支持 Rockchip RK3566、RK3588、RK3399 等平台。 确认开发板的 NPU 型号和版本与 RKNN…

1.BOM-获取元素(获取元素、修改属性)

web Api基本认知 作用&#xff1a;通过JS去操作html页面和浏览器(实现浏览器中的某些功能) 分类&#xff1a; DOM(网页)&#xff1a;Document Object Model(文档对象模型) BOM(浏览器)&#xff1a;Borwser Object Model(浏览器对象模型) DOM DOM树 将网页中标签的关系以树状…

数字孪生10个技术栈:数据处理的六步骤,以获得可靠数据。

一、什么是数据处理 在数字孪生中&#xff0c;数据处理是指对采集到的实时或历史数据进行整理、清洗、分析和转化的过程。数据处理是数字孪生的基础&#xff0c;它将原始数据转化为有意义的信息&#xff0c;用于模型构建、仿真和决策支持。 数据处理是为了提高数据质量、整合数…

Frida-Hook-Native层操作大全

前期准备 使用 jadx 进行逆向工程的基础知识。能够理解 Java 代码。能够编写简短的 JavaScript 代码片段。熟悉 adb。已 root 的设备。对 x86/ARM64 汇编和逆向工程有基础了解。 1、Hook Native层中调用的函数并且读取传入的参数 对于Native层的函数Hook&#xff0c;我们使用…

计算阶梯数 Python

题目描述 爱因斯坦曾出过这样一道有趣的数学题&#xff1a; 有一个长阶梯&#xff0c; 若每步上2阶&#xff0c;最后剩1阶&#xff1b; 若每步上3阶&#xff0c;最后剩2阶&#xff1b; 若每步上5阶&#xff0c;最后剩4阶&#xff1b; 若每步上6阶&#xff0c;最后剩5阶&#xf…

MES+APS难度地狱级,搞定它就是劫后余生呀。

一、什么是MES和APS MES&#xff08;Manufacturing Execution System&#xff09;和APS&#xff08;Advanced Planning and Scheduling&#xff09;是两种在制造业中常用的软件系统&#xff0c;用于优化生产过程和提高生产效率。 MES是一种用于管理和监控制造过程的系统。它与…

九:多播和广播

1 多播 &emsp 多播(Multicast )方式的数据传输是基于UDP完成的。 因此&#xff0c;与UDP服务器端/客户端的实现方式非常接近。 区别在于&#xff0c; UDP数据传输以单一目标进行&#xff0c;而多播数据同时传递到加入(注册)特定组的大量主机。 换言之&#xff0c;采用多播…

嵌入式驱动学习第二周——Linux休眠唤醒

前言 这篇博客来聊一聊Linux系统的休眠与唤醒。 嵌入式驱动学习专栏将详细记录博主学习驱动的详细过程&#xff0c;未来预计四个月将高强度更新本专栏&#xff0c;喜欢的可以关注本博主并订阅本专栏&#xff0c;一起讨论一起学习。现在关注就是老粉啦&#xff01; 目录 前言1. …

Truenas入门级教程

Truenas入门教程 前言&#xff1a;系统相关配置 采用I3 4160&#xff0c;采用了2块500G的硬盘&#xff0c;内存为8G&#xff0c;两个网卡只用了其中一个&#xff0c;系统安装的是core版本 硬件采用DELL3020MT机箱&#xff0c;自带3个SATA网口&#xff0c;后期网口不够&#…

-bash: unzip: 未找到命令的解决方案

遇到 -bash: unzip: 未找到命令 这样的错误信息&#xff0c;表示你的系统中没有安装 unzip 工具。unzip 是一个常用的解压工具&#xff0c;用于解压缩 .zip 文件。你可以通过系统的包管理器安装它。 根据你使用的 Linux 发行版&#xff0c;安装 unzip 的命令会有所不同。下面是…

C# SwinV2 Stable Diffusion 提示词反推 Onnx Demo

目录 介绍 效果 模型信息 项目 代码 下载 C# SwinV2 Stable Diffusion 提示词反推 Onnx Demo 介绍 模型出处github地址&#xff1a;https://github.com/SmilingWolf/SW-CV-ModelZoo 模型下载地址&#xff1a;https://huggingface.co/SmilingWolf/wd-v1-4-swinv2-tagg…