首頁>技術>

1.簡介

在Java應用程式中,Java將自動匯入包java.lang, 包含從NullPointerException到Object,Math和String的許多常用類。

java.lang.System中的類是 final 類,也就是說,我們不能繼承它,因此,所有的方法都是靜態的。

我們研究讀取系統屬性和環境變數的兩種System方法之間的區別。

這些方法是getProperty和getenv。

2.使用System.getProperty()

Java平臺使用Properties物件提供有關本地系統和配置的資訊,我們將其稱為System Properties。

系統屬性包括諸如當前使用者,Java執行時的當前版本以及檔案路徑名分隔符之類的資訊。

在下面的程式碼中,我們使用System.getProperty(“ log_dir”)讀取屬性log_dir的值。我們還使用預設值引數,因此,如果該屬性不存在,則getProperty返回 "/tmp/log":

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

要在執行時更新系統屬性,可以使用System.setProperty 方法 (儘量不要使用):

System.setProperty("log_dir", "/tmp/log");

我們可以使用propertyName命令列引數將自己的屬性或配置值傳遞給應用程式,格式為

java -jar jarName -DpropertyName=value

在app.jar中將foo的屬性設定為bar值:

java -jar app -Dfoo =“ bar”

System.getProperty將始終返回String。

3.使用System.getenv()

環境變數是鍵/值對和 Properties 一樣。許多作業系統使用環境變數來允許將配置資訊傳遞到應用程式中。

設定環境變數的方式因作業系統而異。在Windows中,可以從控制面板使用System Utility應用程式,而在Unix中,可以使用shell指令碼。

建立程序時,預設情況下,它會繼承其父程序的克隆環境變數。

以下程式碼段顯示了使用lambda表示式列印所有環境變數。

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

getenv() 返回一個只讀Map。嘗試向地圖新增值會丟擲 UnsupportedOperationException。

要獲取單個變數,請使用變數名稱呼叫getenv:

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

另一方面,我們可以從應用程式中建立另一個程序,並將新變數新增到其環境中。

要使用Java建立新流程,我們使用ProcessBuilder類,通過 environment 方法可以新增自定義的環境變數

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

儘管兩者本質上都是為String鍵提供String值的對映,但讓我們看一些區別:

當環境變數是作業系統變數的不可變副本時,我們可以在執行時更新屬性。屬性僅包含在Java平臺內,而環境變數在作業系統級別是全域性的-可供同一計算機上執行的所有應用程式使用。打包應用程式時,屬性必須存在,但是我們幾乎可以在任何時候在作業系統上建立環境變數。5.結論

儘管在概念上相似,但是屬性和環境變數的應用都非常不同。

選擇哪一個通常是範圍的問題。使用環境變數,可以將同一應用程式部署到多臺計算機上以執行不同的例項,並且可以在作業系統級別甚至在雲控制檯中進行配置。無需重建應用程式即可更新配置。

始終記住,getProperty遵循駝峰式約定,而getenv則不遵循。

最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 面試官:你怎麼優雅寫 CSS?