1.簡(jiǎn)介
在Java應(yīng)用程序中,Java將自動(dòng)導(dǎo)入包java.lang, 包含從NullPointerException到Object,Math和String的許多常用類。
java.lang.System中的類是 final 類,也就是說(shuō),我們不能繼承它,因此,所有的方法都是靜態(tài)的。
我們研究讀取系統(tǒng)屬性和環(huán)境變量的兩種System方法之間的區(qū)別。
這些方法是getProperty和getenv。
2.使用System.getProperty()
Java平臺(tái)使用Properties對(duì)象提供有關(guān)本地系統(tǒng)和配置的信息,我們將其稱為System Properties。
系統(tǒng)屬性包括諸如當(dāng)前用戶,Java運(yùn)行時(shí)的當(dāng)前版本以及文件路徑名分隔符之類的信息。
在下面的代碼中,我們使用System.getProperty(“ log_dir”)讀取屬性log_dir的值。我們還使用默認(rèn)值參數(shù),因此,如果該屬性不存在,則getProperty返回 "/tmp/log":
String log_dir = System.getProperty("log_dir","/tmp/log");
要在運(yùn)行時(shí)更新系統(tǒng)屬性,可以使用System.setProperty 方法 (盡量不要使用):
System.setProperty("log_dir", "/tmp/log");
我們可以使用propertyName命令行參數(shù)將自己的屬性或配置值傳遞給應(yīng)用程序,格式為
java -jar jarName -DpropertyName=value
在app.jar中將foo的屬性設(shè)置為bar值:
java -jar app -Dfoo =“ bar”
System.getProperty將始終返回String。
3.使用System.getenv()
環(huán)境變量是鍵/值對(duì)和 Properties 一樣。許多操作系統(tǒng)使用環(huán)境變量來(lái)允許將配置信息傳遞到應(yīng)用程序中。
設(shè)置環(huán)境變量的方式因操作系統(tǒng)而異。在Windows中,可以從控制面板使用System Utility應(yīng)用程序,而在Unix中,可以使用shell腳本。
創(chuàng)建進(jìn)程時(shí),默認(rèn)情況下,它會(huì)繼承其父進(jìn)程的克隆環(huán)境變量。
以下代碼段顯示了使用lambda表達(dá)式打印所有環(huán)境變量。
System.getenv().forEach((k, v) -> { System.out.println(k + ":" + v);});
getenv() 返回一個(gè)只讀Map。嘗試向地圖添加值會(huì)拋出 UnsupportedOperationException。
要獲取單個(gè)變量,請(qǐng)使用變量名稱調(diào)用getenv:
String log_dir = System.getenv("log_dir");
另一方面,我們可以從應(yīng)用程序中創(chuàng)建另一個(gè)進(jìn)程,并將新變量添加到其環(huán)境中。
要使用Java創(chuàng)建新流程,我們使用ProcessBuilder類,通過(guò) environment 方法可以添加自定義的環(huán)境變量
ProcessBuilder pb = new ProcessBuilder(args);Map
4.差異
盡管兩者本質(zhì)上都是為String鍵提供String值的映射,但讓我們看一些區(qū)別:
當(dāng)環(huán)境變量是操作系統(tǒng)變量的不可變副本時(shí),我們可以在運(yùn)行時(shí)更新屬性。
屬性僅包含在Java平臺(tái)內(nèi),而環(huán)境變量在操作系統(tǒng)級(jí)別是全局的-可供同一計(jì)算機(jī)上運(yùn)行的所有應(yīng)用程序使用。
打包應(yīng)用程序時(shí),屬性必須存在,但是我們幾乎可以在任何時(shí)候在操作系統(tǒng)上創(chuàng)建環(huán)境變量。
5.結(jié)論
盡管在概念上相似,但是屬性和環(huán)境變量的應(yīng)用都非常不同。
選擇哪一個(gè)通常是范圍的問(wèn)題。使用環(huán)境變量,可以將同一應(yīng)用程序部署到多臺(tái)計(jì)算機(jī)上以運(yùn)行不同的實(shí)例,并且可以在操作系統(tǒng)級(jí)別甚至在云控制臺(tái)中進(jìn)行配置。無(wú)需重建應(yīng)用程序即可更新配置。
始終記住,getProperty遵循駝峰式約定,而getenv則不遵循。
-
WINDOWS
+關(guān)注
關(guān)注
3文章
3503瀏覽量
87879 -
JAVA
+關(guān)注
關(guān)注
19文章
2943瀏覽量
104089 -
UNIX
+關(guān)注
關(guān)注
0文章
296瀏覽量
41334
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論