天天看點

Java System.getProperty 和 System.getenv 差別Java System.getProperty 和 System.getenv 差別

Java System.getProperty 和 System.getenv 差別

介紹

java.lang包在java應用中會自動導入。該包包含很多常用的類,從NullPointException到Object,Math以及String等。

java.lang.System類是一個final類,意味這我們不能建立它的執行個體,是以其所有方法都是static。下面我們說明兩個系統方法讀取系統屬性和環境變量的差別,方法名稱分别為getProperty and getenv。

使用System.getProperty()

java平台使用Properties 對象去提供本地系統配置資訊,我們稱為系統屬性。系統屬性包括目前使用者,java運作時的版本,以及檔案路徑分隔符等。

下面代碼中,我們使用

System.getProperty(“log_dir”)

讀取log_dir屬性的值,也可以使用預設值參數,確定如果屬性不存在,則傳回預設值。

System.getProperty 總是傳回字元串。

String log_dir = System.getProperty("log_dir","/tmp/log");
           

為了在運作時更新系統屬性, 使用System.setProperty 方法:

我們也可以使用屬性指令行參數方式傳遞我們屬性或配置值給應用程式:

java -jar jarName -DpropertyName=value
           

給app.jar應用的foo屬性設定值為bar:

java -jar app -Dfoo=”bar”
           

使用System.getenv()

環境變量與屬性類似,也是鍵值對形式。大多數作業系統使用環境變量,可以把配置資訊傳遞給應用程式。

不同作業系統設定環境變量方式不同,舉例,windows使用控制台中系統程式,而Unix使用shell腳本。當建立一個程序是,預設其繼承其父程序的環境變量副本。

下面代碼片段展示lambda表達式列印所有環境變量:

System.getenv().forEach((k, v) -> {
    System.out.println(k + ":" + v);
});
           

getenv() 傳回隻讀 Map. 嘗試給 map 增加至會抛出 UnsupportedOperationException異常。擷取單個變量,可以調用getenv()方法并指定變量名:

String log_dir = System.getenv("log_dir");
           

另外,我們可以從我們的應用中建立另一個程序,此時可以給他環境增加變量。在java可以通過ProcessBuilder 類建立程序,其environment方法傳回環境變量Map,但此map不是隻讀的,我們可以增加相應元素。

ProcessBuilder pb = new ProcessBuilder(args);
Map<String, String> env = pb.environment();
env.put("log_dir", "/tmp/log");
Process process = pb.start();
           

兩者差異

雖然兩者本質都是map,提供字元串鍵和值,但有一些不同:

  1. 我們可以在運作時更新屬性,環境變量是作業系統變量的不可變副本,不能修改。
  2. 屬性僅在java平台中有效,而環境變量是全局的,屬于作業系統級——運作在同一台機器上的所有應用都有效。
  3. 當打包應用是屬性必須存在,但我們可以在任何時候建立環境變量。

總結

雖然在概念上是相似的,但是屬性和環境變量的應用是完全不同的。選擇的關鍵是範圍問題,使用環境變量,同一個應用可以部署在多個機器上運作不同執行個體,可以在作業系統級别進行配置,甚至在雲主機控制台中配置。無需重新編譯建構應用去更新配置。

另外getProperty遵循駱駝命名約定,而getenv不是。

繼續閱讀