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