詳解Java擷取環境變數及系統屬性的方法_java

來源:互聯網
上載者:User

環境變數這個概念不陌生, 就是作業系統的環境變數。
系統變數就是java本身維護的變數。 通過 System.getProperty 的方式擷取。
對於不同的作業系統來說, 環境變數的處理可能會有一些不統一的地方, 比如說: 不區分大小寫 等等。

Java 擷取環境變數
Java 擷取環境變數的方式很簡單:
System.getEnv()  得到所有的環境變數
System.getEnv(key) 得到某個環境變數的值
 

Map map = System.getenv(); Iterator it = map.entrySet().iterator(); while(it.hasNext()) {   Entry entry = (Entry)it.next();   System.out.print(entry.getKey()+"=");   System.out.println(entry.getValue()); } 

如果是windows 系統, 列印出來的值通過從 “我的電腦” 裡看到的環境變數是一樣的。

Java 擷取和設定系統變數
Java 擷取環境變數的方式也很簡單:
System.getProperties()  得到所有的系統變數
System.getProperty(key)  得到某個系統變數的值
 

Properties properties = System.getProperties(); Iterator it = properties.entrySet().iterator(); while(it.hasNext()) {   Entry entry = (Entry)it.next();   System.out.print(entry.getKey()+"=");   System.out.println(entry.getValue()); } 

 系統變數除了可以擷取之外, 還可以通過System.setProperty(key, value)  的方式設定自己需要的系統變數。

預設情況下, java 設定了哪些系統變數:

  • java.version Java 運行時環境版本
  • java.vendor Java 運行時環境供應商
  • java.vendor.url Java 供應商的 URL
  • java.home Java 安裝目錄
  • java.vm.specification.version JAVA 虛擬機器規範版本
  • java.vm.specification.vendor JAVA 虛擬機器規範供應商
  • java.vm.specification.name JAVA 虛擬機器正式名稱
  • java.vm.version JAVA 虛擬機器實現版本
  • java.vm.vendor JAVA 虛擬機器實現供應商
  • java.vm.name JAVA 虛擬機器實現名稱
  • java.specification.version Java 運行時環境規範版本
  • java.specification.vendor Java 運行時環境規範供應商
  • java.specification.name Java 運行時環境正式名稱
  • java.class.version Java 類格式版本號碼
  • java.class.path Java 類路徑
  • java.library.path 載入庫時搜尋的路徑列表
  • java.io.tmpdir 預設的臨時檔案路徑
  • java.compiler 要使用的 JIT 編譯器的名稱
  • java.ext.dirs 一個或多個擴充目錄的路徑
  • os.name 作業系統的名稱
  • os.arch 作業系統的架構
  • os.version 作業系統的版本
  • file.separator 檔案分隔字元(在 UNIX 系統中是"/")
  • path.separator 路徑分隔字元(在 UNIX 系統中是":")
  • line.separator 行分隔字元(在 UNIX 系統中是"/n")
  • user.name 使用者的賬戶名稱
  • user.home 使用者的主目錄
  • user.dir 使用者的當前工作目錄

補充
1 . 在.bat ;  .cmd 或  .sh 中會通過 set 的方式設定一些變數,
比如weblogic 的 setDomainEnv.cmd
set SUN_JAVA_HOME=C:\Oracle\Middleware\jdk160_21
這裡設定的是環境變數
2. 在log4j 的配置中, 有時會配置log file 的產生路徑。
比如 ${LOG_DIR}/logfile.log, 這裡的LOG_DIR 是被系統屬性的變數替換的。
3. 看一下java 源碼, 通過 System.getProperties() 的方式擷取系統變數時, 會有一個安全的檢查
 

  public static Properties getProperties() { SecurityManager sm = getSecurityManager();     if (sm != null) {   sm.checkPropertiesAccess(); }  return props;   } 

在 單個Java application  測試時, System 裡的SecurityManager 是空的。
在Applet 運行時, 會結合 .policy 這個檔案來檢查許可權。

如果給一個空的SecurityManager 會發現就會拋出許可權異常。
 

public static void main(String[] args) {   // TODO Auto-generated method stub   System.setSecurityManager(new SecurityManager());   //SecurityManager sm = System.getSecurityManager();   //System.out.println(sm);   System.getSecurityManager().checkPropertiesAccess(); } 
System.getEnv()和System.getProperties()的區別
從概念上講,系統屬性 和環境變數 都是名稱與值之間的映射。兩種機制都能用來將使用者定義的資訊傳遞給 Java 進程。環境變數產生更多的全域效應,因為它們不僅對Java 子進程可見,而且對於定義它們的進程的所有子進程都是可見的。在不同的作業系統上,它們的語義有細微的差別,比如,不區分大小寫。因為這些原因,環境變數更可能有意料不到的副作用。最好在可能的地方使用系統屬性。環境變數應該在需要全域效應的時候使用,或者在外部系統介面要求使用環境變數時使用(比如 PATH)。
代碼如下:
public static void main(String [] args)    {       Map m = System.getenv();       for ( Iterator it = m.keySet().iterator(); it.hasNext(); )       {           String key = (String ) it.next();           String value = (String ) m.get(key);           System.out.println(key +":" +value);       }       System.out.println( "--------------------------------------" );       Properties p = System.getProperties();              for ( Iterator it = p.keySet().iterator(); it.hasNext(); )       {           String key = (String ) it.next();           String value = (String ) p.get(key);           System.out.println(key +":" +value);       }    }
 
輸入如下:
ANT_HOME:D:/program/devel/antPROCESSOR_ARCHITECTURE:x86LOGONSERVER://RJ-WEIJIANJUNHOMEDRIVE:C:CATALINA_HOME:D:/program/server/Tomcat5.5DXSDK_DIR:d:/Program Files/Microsoft DirectX SDK (August 2008)/VS80COMNTOOLS:C:/Program Files/Microsoft Visual Studio 8/Common7/Tools/SESSIONNAME:ConsoleHOMEPATH:/Documents and Settings/AdministratorTMP:C:/DOCUME~1/ADMINI~1/LOCALS~1/Tempwindir:C:/WINDOWSPROCESSOR_IDENTIFIER:x86 Family 6 Model 15 Stepping 13, GenuineIntelVS90COMNTOOLS:e:/Program Files/Microsoft Visual Studio 9.0/Common7/Tools/SystemDrive:C:USERPROFILE:C:/Documents and Settings/AdministratorPATHEXT:.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSHCommonProgramFiles:C:/Program Files/Common FilesNUMBER_OF_PROCESSORS:2ComSpec:C:/WINDOWS/system32/cmd.exeCOMPUTERNAME:RJ-WEIJIANJUNOS:Windows_NTUSERNAME:AdministratorCLIENTNAME:ConsoleTEMP:C:/DOCUME~1/ADMINI~1/LOCALS~1/TempUSERDOMAIN:RJ-WEIJIANJUNALLUSERSPROFILE:C:/Documents and Settings/All Userslib:C:/Program Files/SQLXML 4.0/bin/PROCESSOR_LEVEL:6SystemRoot:C:/WINDOWSClusterLog:C:/WINDOWS/Cluster/cluster.logAPPDATA:C:/Documents and Settings/Administrator/Application DataPath:C:/WINDOWS/system32;C:/WINDOWS;C:/WINDOWS/System32/Wbem;C:/Program Files/Microsoft SQL Server/80/Tools/Binn/;C:/Program Files/Microsoft SQL Server/90/DTS/Binn/;C:/Program Files/Microsoft SQL Server/90/Tools/binn/;C:/Program Files/Microsoft SQL Server/90/Tools/Binn/VSShell/Common7/IDE/;C:/Program Files/Microsoft Visual Studio 8/Common7/IDE/PrivateAssemblies/;D:/program/devel/flex_sdk2/bin;D:/program/devel/ant/bin;C:/Program Files/Java/jdk1.6.0_07/bin;%JONAS_ROOT%/bin/nt;d:/program/devel/ant/binJAVA_HOME:C:/Program Files/Java/jdk1.6.0_07FP_NO_HOST_CHECK:NOPROCESSOR_REVISION:0f0dProgramFiles:C:/Program Files
以下是property的輸出:
--------------------------------------java.runtime.name:Java(TM) 2 Runtime Environment, Standard Editionsun.boot.library.path:D:/Program Files/MyEclipse 6.5/jre/binjava.vm.version:1.5.0_11-b03java.vm.vendor:Sun Microsystems Inc.java.vendor.url:http://java.sun.com/path.separator:;java.vm.name:Java HotSpot(TM) Client VMfile.encoding.pkg:sun.iosun.java.launcher:SUN_STANDARDuser.country:CNsun.os.patch.level:Service Pack 2java.vm.specification.name:Java Virtual Machine Specificationuser.dir:D:/dev/eclipse/mye65/workspace/jmxjava.runtime.version:1.5.0_11-b03java.awt.graphicsenv:sun.awt.Win32GraphicsEnvironmentjava.endorsed.dirs:D:/Program Files/MyEclipse 6.5/jre/lib/endorsedos.arch:x86java.io.tmpdir:C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/line.separator: java.vm.specification.vendor:Sun Microsystems Inc.user.variant:os.name:Windows 2003sun.jnu.encoding:GBKjava.library.path:D:/Program Files/MyEclipse 6.5/jre/bin;.;C:/WINDOWS/system32;C:/WINDOWS;C:/WINDOWS/system32;C:/WINDOWS;C:/WINDOWS/System32/Wbem;C:/Program Files/Microsoft SQL Server/80/Tools/Binn/;C:/Program Files/Microsoft SQL Server/90/DTS/Binn/;C:/Program Files/Microsoft SQL Server/90/Tools/binn/;C:/Program Files/Microsoft SQL Server/90/Tools/Binn/VSShell/Common7/IDE/;C:/Program Files/Microsoft Visual Studio 8/Common7/IDE/PrivateAssemblies/;D:/program/devel/flex_sdk2/bin;D:/program/devel/ant/bin;C:/Program Files/Java/jdk1.6.0_07/bin;%JONAS_ROOT%/bin/nt;d:/program/devel/ant/binjava.specification.name:Java Platform API Specificationjava.class.version:49.0sun.management.compiler:HotSpot Client Compileros.version:5.2user.home:C:/Documents and Settings/Administratoruser.timezone:Asia/Shanghaijava.awt.printerjob:sun.awt.windows.WPrinterJobfile.encoding:GBKjava.specification.version:1.5java.class.path:D:/dev/eclipse/mye65/workspace/jmx/bin;D:/program/lib/jmx/jmxtools.jar;D:/program/lib/log/commons-logging-1.1.1.jar;D:/program/lib/log/log4j-1.2.15.jar;D:/program/lib/registry/registry.jaruser.name:Administratorjava.vm.specification.version:1.0java.home:D:/Program Files/MyEclipse 6.5/jresun.arch.data.model:32user.language:zhjava.specification.vendor:Sun Microsystems Inc.awt.toolkit:sun.awt.windows.WToolkitjava.vm.info:mixed modejava.version:1.5.0_11java.ext.dirs:D:/Program Files/MyEclipse 6.5/jre/lib/extsun.boot.class.path:D:/Program Files/MyEclipse 6.5/jre/lib/rt.jar;D:/Program Files/MyEclipse 6.5/jre/lib/i18n.jar;D:/Program Files/MyEclipse 6.5/jre/lib/sunrsasign.jar;D:/Program Files/MyEclipse 6.5/jre/lib/jsse.jar;D:/Program Files/MyEclipse 6.5/jre/lib/jce.jar;D:/Program Files/MyEclipse 6.5/jre/lib/charsets.jar;D:/Program Files/MyEclipse 6.5/jre/classesjava.vendor:Sun Microsystems Inc.file.separator:/java.vendor.url.bug:http://java.sun.com/cgi-bin/bugreport.cgisun.io.unicode.encoding:UnicodeLittlesun.cpu.endian:littlesun.desktop:windowssun.cpu.isalist:pentium_pro+mmx pentium_pro pentium+mmx pentium i486 i386 i86
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.