使用java批量寫(xiě)入環(huán)境變量的實(shí)現(xiàn)
環(huán)境需求
jdk版本:1.8
jna依賴(lài):
<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>
獲取環(huán)境變量
/** * 獲取指定環(huán)境變量的內(nèi)容,如果該環(huán)境變量不存在,則返回null * @param variableName 環(huán)境變量名稱(chēng) * @return String * @version 2.2 * @author suhuamo */ public static String getEnvironmentVariables(String variableName) { // 注冊(cè)表中環(huán)境變量所在位置 String registryPath = "SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment"; try { return Advapi32Util.registryGetStringValue(WinReg.HKEY_LOCAL_MACHINE, registryPath, variableName); // 如果找不到這個(gè)環(huán)境變量,則會(huì)拋出異常 } catch (Exception e) { return null; } }
重要參數(shù)介紹:
registryPath
:注冊(cè)表中環(huán)境變量所在位置,即【目前打開(kāi)的這個(gè)文件就是環(huán)境變量的注冊(cè)表文件】
WinReg.HKEY_LOCAL_MACHINE
:環(huán)境變量在注冊(cè)表中的所屬組,即
variableName
:需要查找的環(huán)境變量的名稱(chēng),即
這一列的任意一個(gè)。
設(shè)置環(huán)境變量
/** * 批量寫(xiě)入環(huán)境變量 * @param systemEnvironmentVariables 需要寫(xiě)入的環(huán)境變量,<k:v> 對(duì)應(yīng) <環(huán)境變量名稱(chēng):環(huán)境變量的值> * @return void * @version 2.2 * @author suhuamo */ public static void setSystemEnvironmentVariables(Map<String, String> systemEnvironmentVariables){ // 注冊(cè)表中環(huán)境變量所在位置 String registryPath = "SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment"; // 遍歷每一組需要寫(xiě)入的環(huán)境變量 for (Map.Entry<String, String> entry : systemEnvironmentVariables.entrySet()) { // 將該組環(huán)境變量的內(nèi)容寫(xiě)入注冊(cè)表文件中 Advapi32Util.registrySetStringValue(WinReg.HKEY_LOCAL_MACHINE, registryPath, entry.getKey(), entry.getValue()); } }
整合可直接使用的工具類(lèi)
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 * 操作操作系統(tǒng)的工具類(lèi) */ public class OSUtil { /** * 注冊(cè)表中環(huán)境變量所在位置 * @version 2.2 * @author suhuamo * @with {@link } */ public static final String registryPath = "SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment"; /** * 批量寫(xiě)入環(huán)境變量 * @param systemEnvironmentVariables 需要寫(xiě)入的環(huán)境變量,<k:v> 對(duì)應(yīng) <環(huán)境變量名稱(chēng):環(huán)境變量的值> * @return void * @version 2.2 * @author suhuamo */ public static void setSystemEnvironmentVariables(Map<String, String> systemEnvironmentVariables) { // 遍歷每一組需要寫(xiě)入的環(huán)境變量 for (Map.Entry<String, String> entry : systemEnvironmentVariables.entrySet()) { // 將該組環(huán)境變量的內(nèi)容寫(xiě)入注冊(cè)表文件中 Advapi32Util.registrySetStringValue(WinReg.HKEY_LOCAL_MACHINE, registryPath, entry.getKey(), entry.getValue()); } } /** * 獲取指定環(huán)境變量的內(nèi)容,如果該環(huán)境變量不存在,則返回null * @param variableName 環(huán)境變量名稱(chēng) * @return String * @version 2.2 * @author suhuamo */ public static String getEnvironmentVariables(String variableName) { try { return Advapi32Util.registryGetStringValue(WinReg.HKEY_LOCAL_MACHINE, registryPath, variableName); // 如果找不到這個(gè)環(huán)境變量,則會(huì)拋出異常 } catch (Exception e) { return null; } } }
提示:
寫(xiě)入注冊(cè)表的時(shí)候最消耗時(shí)間的是讀取到注冊(cè)表文件的句柄,當(dāng)讀取到了之后,寫(xiě)入注冊(cè)表的耗時(shí)不到1毫秒,即如果是寫(xiě)入環(huán)境變量,寫(xiě)入1個(gè)環(huán)境變量的時(shí)間和寫(xiě)入100個(gè)環(huán)境變量的時(shí)間消耗時(shí)間幾乎相同。
寫(xiě)入1個(gè)環(huán)境變量
package org.yscz.aiks; import java.util.HashMap; import java.util.Map; /** * @author suhuamo * @slogan 巨人給你鞠躬,是為了讓陽(yáng)光也照射到你。 * @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("當(dāng)前消耗時(shí)間:" + (end - start) + "ms"); } }
寫(xiě)入100個(gè)環(huán)境變量
package org.yscz.aiks; import java.util.HashMap; import java.util.Map; /** * @author suhuamo * @slogan 巨人給你鞠躬,是為了讓陽(yáng)光也照射到你。 * @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("當(dāng)前消耗時(shí)間:" + (end - start) + "ms"); } }
分析
第一個(gè)還慢一點(diǎn)是因?yàn)椴煌瑫r(shí)間,電腦的運(yùn)行內(nèi)存情況不同,但可以基本上看出效率和寫(xiě)入環(huán)境變量的個(gè)數(shù)無(wú)關(guān)。
分析for循環(huán)中每一次寫(xiě)入注冊(cè)表的執(zhí)行速度。
/** * 批量寫(xiě)入環(huán)境變量 * @param systemEnvironmentVariables 需要寫(xiě)入的環(huán)境變量,<k:v> 對(duì)應(yīng) <環(huán)境變量名稱(chēng):環(huán)境變量的值> * @return void * @version 2.2 * @author suhuamo */ public static void setSystemEnvironmentVariables(Map<String, String> systemEnvironmentVariables) { int idx = 0; // 遍歷每一組需要寫(xiě)入的環(huán)境變量 for (Map.Entry<String, String> entry : systemEnvironmentVariables.entrySet()) { long start = System.currentTimeMillis(); // 將該組環(huán)境變量的內(nèi)容寫(xiě)入注冊(cè)表文件中 Advapi32Util.registrySetStringValue(WinReg.HKEY_LOCAL_MACHINE, registryPath, entry.getKey(), entry.getValue()); long end = System.currentTimeMillis(); System.out.printf("第%d組環(huán)境變量寫(xiě)入完成,耗時(shí)%dms%n",++idx, end - start); } }
輸出內(nèi)容:
輸出內(nèi)容第1組環(huán)境變量寫(xiě)入完成,耗時(shí)1000ms
第2組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第3組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第4組環(huán)境變量寫(xiě)入完成,耗時(shí)1ms
第5組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第6組環(huán)境變量寫(xiě)入完成,耗時(shí)1ms
第7組環(huán)境變量寫(xiě)入完成,耗時(shí)1ms
第8組環(huán)境變量寫(xiě)入完成,耗時(shí)1ms
第9組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第10組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第11組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第12組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第13組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第14組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第15組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第16組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第17組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第18組環(huán)境變量寫(xiě)入完成,耗時(shí)1ms
第19組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第20組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第21組環(huán)境變量寫(xiě)入完成,耗時(shí)1ms
第22組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第23組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第24組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第25組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第26組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第27組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第28組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第29組環(huán)境變量寫(xiě)入完成,耗時(shí)1ms
第30組環(huán)境變量寫(xiě)入完成,耗時(shí)20ms
第31組環(huán)境變量寫(xiě)入完成,耗時(shí)2ms
第32組環(huán)境變量寫(xiě)入完成,耗時(shí)1ms
第33組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第34組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第35組環(huán)境變量寫(xiě)入完成,耗時(shí)1ms
第36組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第37組環(huán)境變量寫(xiě)入完成,耗時(shí)1ms
第38組環(huán)境變量寫(xiě)入完成,耗時(shí)1ms
第39組環(huán)境變量寫(xiě)入完成,耗時(shí)1ms
第40組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第41組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第42組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第43組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第44組環(huán)境變量寫(xiě)入完成,耗時(shí)1ms
第45組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第46組環(huán)境變量寫(xiě)入完成,耗時(shí)1ms
第47組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第48組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第49組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第50組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第51組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第52組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第53組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第54組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第55組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第56組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第57組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第58組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第59組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第60組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第61組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第62組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第63組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第64組環(huán)境變量寫(xiě)入完成,耗時(shí)6ms
第65組環(huán)境變量寫(xiě)入完成,耗時(shí)1ms
第66組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第67組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第68組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第69組環(huán)境變量寫(xiě)入完成,耗時(shí)1ms
第70組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第71組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第72組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第73組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第74組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第75組環(huán)境變量寫(xiě)入完成,耗時(shí)1ms
第76組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第77組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第78組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第79組環(huán)境變量寫(xiě)入完成,耗時(shí)1ms
第80組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第81組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第82組環(huán)境變量寫(xiě)入完成,耗時(shí)1ms
第83組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第84組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第85組環(huán)境變量寫(xiě)入完成,耗時(shí)1ms
第86組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第87組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第88組環(huán)境變量寫(xiě)入完成,耗時(shí)1ms
第89組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第90組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第91組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第92組環(huán)境變量寫(xiě)入完成,耗時(shí)1ms
第93組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第94組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第95組環(huán)境變量寫(xiě)入完成,耗時(shí)1ms
第96組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第97組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第98組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
第99組環(huán)境變量寫(xiě)入完成,耗時(shí)1ms
第100組環(huán)境變量寫(xiě)入完成,耗時(shí)0ms
當(dāng)前消耗時(shí)間:1118ms
可以看到,只有第一次寫(xiě)入環(huán)境變量時(shí)很慢,接下來(lái)的每一次幾乎都沒(méi)有消耗時(shí)間:
擴(kuò)展
另一種寫(xiě)入環(huán)境變量的方法,就是通過(guò)cmd命令setx name value /M
寫(xiě)入環(huán)境變量,每一次寫(xiě)入的時(shí)間是相同的,100ms~500ms。
/** * 設(shè)置環(huán)境變量 * @param variableName * @param variableValue */ public static boolean setEnvironmentVariable(String variableName, String variableValue) { // 執(zhí)行 setx 命令來(lái)設(shè)置環(huán)境變量 try { String command = "setx " + variableName + " \"" + variableValue + "\" /M"; Process process = Runtime.getRuntime().exec(command); // 等待命令執(zhí)行完成 int exitCode = process.waitFor(); if (exitCode == 0) { log.info("設(shè)置:{}環(huán)境變量成功,生成內(nèi)容為:{}", variableName, variableValue); } else { log.error("設(shè)置:{}環(huán)境變量失敗,生成內(nèi)容為:{}", variableName, variableValue); return false; } } catch (IOException | InterruptedException e) { log.error("設(shè)置環(huán)境變量時(shí)出現(xiàn)異常,異常原因:{}",e.getMessage()); return false; } return true; }
到此這篇關(guān)于使用java批量寫(xiě)入環(huán)境變量的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)java批量寫(xiě)入環(huán)境變量?jī)?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java數(shù)據(jù)庫(kù)操作類(lèi)演示實(shí)例分享(java連接數(shù)據(jù)庫(kù))
java數(shù)據(jù)庫(kù)操作類(lèi)演示實(shí)例分享,大家參考使用吧2013-12-12Java利用反射實(shí)現(xiàn)框架類(lèi)的方法實(shí)例
這篇文章主要給大家介紹了關(guān)于Java利用反射實(shí)現(xiàn)框架類(lèi)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10JavaWeb連接數(shù)據(jù)庫(kù)MySQL的操作技巧
數(shù)據(jù)庫(kù)是編程中重要的一部分,它囊括了數(shù)據(jù)操作,數(shù)據(jù)持久化等各方面。在每一門(mén)編程語(yǔ)言中都占有相當(dāng)大的比例。本次,小編以MySQL為例,使用mvc編程思想,給大家講解下javaweb對(duì)數(shù)據(jù)庫(kù)的操作2017-02-02javaweb開(kāi)發(fā)提高效率利器JRebel詳解
這篇文章主要介紹了javaweb開(kāi)發(fā)提高效率利器JRebel詳解,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04解決SpringBoot在IDEA中熱部署失效問(wèn)題
熱部署是指程序運(yùn)行過(guò)程中實(shí)時(shí)更新或替換其組件的技術(shù),即項(xiàng)目正在啟動(dòng)中,修改了配置文件中某個(gè)值或者添加了某個(gè)方法或者修改了某個(gè)方法參數(shù),本文給大家介紹了解決SpringBoot在IDEA中熱部署失效問(wèn)題,需要的朋友可以參考下2024-01-01關(guān)于Nacos和Eureka的區(qū)別及說(shuō)明
這篇文章主要介紹了關(guān)于Nacos和Eureka的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06java?設(shè)計(jì)模式從風(fēng)控鏈理解責(zé)任鏈模式
這篇文章主要為大家介紹了java?設(shè)計(jì)模式從風(fēng)控鏈理解責(zé)任鏈模式示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05