详解Java获取环境变量及系统属性的方法

作者:oscar999 时间:2021-08-23 16:58:03 

环境变量这个概念不陌生, 就是操作系统的环境变量。
系统变量就是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/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

以下是property的输出:


--------------------------------------
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
标签:Java,环境变量,系统属性
0
投稿

猜你喜欢

  • android连续拖动导致挂起的解决方法

    2021-08-06 07:11:39
  • Struts2通过自定义标签实现权限控制的方法

    2021-07-19 11:06:22
  • 全局记录Feign的请求和响应日志方式

    2021-08-19 18:48:02
  • Android实现登录注册功能

    2023-07-31 09:35:44
  • 基于RxJava实现酷炫启动页

    2023-09-26 21:50:47
  • spring boot配置多个请求服务代理的完整步骤

    2023-03-30 10:30:49
  • 高并发下如何避免重复数据产生技巧

    2022-04-17 07:08:57
  • 简单解析java方法在调用在内存中的执行过程

    2022-04-12 15:46:26
  • Gradle配置教程之自定义APK名称与输出路径

    2023-03-04 17:35:27
  • Android编程实现XML解析与保存的三种方法详解

    2022-04-15 00:39:01
  • Spring Boot 集成PageHelper的使用方法

    2021-10-04 19:16:30
  • Android实现文件上传和下载倒计时功能的圆形进度条

    2023-12-08 16:45:35
  • Android实现仿360桌面悬浮清理内存

    2021-08-25 11:21:05
  • 详解C++设计模式编程中建造者模式的实现

    2022-10-25 01:33:20
  • c#字符串值类型与引用类型比较示例

    2021-12-19 04:26:33
  • Android APK使用Debug签名重新打包 Eclipse更改默认Debug签名

    2022-03-07 13:27:12
  • C#中FormClosing与FormClosed的区别详细解析

    2023-01-26 16:28:13
  • elasticsearch java客户端action的实现简单分析

    2022-04-25 05:39:45
  • 创建Android守护进程实例(底层服务)

    2021-11-12 01:37:09
  • 桌面浮动窗口(类似恶意广告)的实现详解

    2023-04-28 06:02:27
  • asp之家 软件编程 m.aspxhome.com