详解Java获取环境变量及系统属性的方法
环境变量这个概念不陌生, 就是操作系统的环境变量。
系统变量就是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(); }
从概念上讲,系统属性 和环境变量 都是名称与值之间的映射。两种机制都能用来将用户定义的信息传递给 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/ant processor_architecture:x86 logonserver://rj-weijianjun homedrive:c: catalina_home:d:/program/server/tomcat5.5 dxsdk_dir:d:/program files/microsoft directx sdk (august 2008)/ vs80comntools:c:/program files/microsoft visual studio 8/common7/tools/ sessionname:console homepath:/documents and settings/administrator tmp:c:/docume~1/admini~1/locals~1/temp windir:c:/windows processor_identifier:x86 family 6 model 15 stepping 13, genuineintel vs90comntools:e:/program files/microsoft visual studio 9.0/common7/tools/ systemdrive:c: userprofile:c:/documents and settings/administrator pathext:.com;.exe;.bat;.cmd;.vbs;.vbe;.js;.jse;.wsf;.wsh commonprogramfiles:c:/program files/common files number_of_processors:2 comspec:c:/windows/system32/cmd.exe computername:rj-weijianjun os:windows_nt username:administrator clientname:console temp:c:/docume~1/admini~1/locals~1/temp userdomain:rj-weijianjun allusersprofile:c:/documents and settings/all users lib:c:/program files/sqlxml 4.0/bin/ processor_level:6 systemroot:c:/windows clusterlog:c:/windows/cluster/cluster.log appdata:c:/documents and settings/administrator/application data path: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/bin java_home:c:/program files/java/jdk1.6.0_07 fp_no_host_check:no processor_revision:0f0d programfiles:c:/program files
-------------------------------------- java.runtime.name:java(tm) 2 runtime environment, standard edition sun.boot.library.path:d:/program files/myeclipse 6.5/jre/bin java.vm.version:1.5.0_11-b03 java.vm.vendor:sun microsystems inc. java.vendor.url:http://java.sun.com/ path.separator:; java.vm.name:java hotspot(tm) client vm file.encoding.pkg:sun.io sun.java.launcher:sun_standard user.country:cn sun.os.patch.level:service pack 2 java.vm.specification.name:java virtual machine specification user.dir:d:/dev/eclipse/mye65/workspace/jmx java.runtime.version:1.5.0_11-b03 java.awt.graphicsenv:sun.awt.win32graphicsenvironment java.endorsed.dirs:d:/program files/myeclipse 6.5/jre/lib/endorsed os.arch:x86 java.io.tmpdir:c:/docume~1/admini~1/locals~1/temp/ line.separator: java.vm.specification.vendor:sun microsystems inc. user.variant: os.name:windows 2003 sun.jnu.encoding:gbk java.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/bin java.specification.name:java platform api specification java.class.version:49.0 sun.management.compiler:hotspot client compiler os.version:5.2 user.home:c:/documents and settings/administrator user.timezone:asia/shanghai java.awt.printerjob:sun.awt.windows.wprinterjob file.encoding:gbk java.specification.version:1.5 java.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.jar user.name:administrator java.vm.specification.version:1.0 java.home:d:/program files/myeclipse 6.5/jre sun.arch.data.model:32 user.language:zh java.specification.vendor:sun microsystems inc. awt.toolkit:sun.awt.windows.wtoolkit java.vm.info:mixed mode java.version:1.5.0_11 java.ext.dirs:d:/program files/myeclipse 6.5/jre/lib/ext sun.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/classes java.vendor:sun microsystems inc. file.separator:/ java.vendor.url.bug:http://java.sun.com/cgi-bin/bugreport.cgi sun.io.unicode.encoding:unicodelittle sun.cpu.endian:little sun.desktop:windows sun.cpu.isalist:pentium_pro+mmx pentium_pro pentium+mmx pentium i486 i386 i86