对于环境变量和系统属性,我们应该并不陌生,因为在安装JDK的时候需要配置环境变量,安装完之后我们需要查看JDK的版本,我们就需要使用查看系统属性。
但在Java代码中,我们应该如何去使用环境变量和系统属性呢?下面就来学习一下吧。
当我们在程序中需要使用与操作系统相关的变量(例如:文件分隔符、换行符)时,Java提供了System类的静态方法getenv()方法和getProperty()方法,用于返回系统相关的环境变量与系统属性。
getenv()方法返回的变量大多与操作系统相关;
getProperty()方法返回的变量大多与Java程序有关;
系统属性和环境变量都是key-value形式的,两种机制都能用来将用户定义的信息传递给 Java进程。
说明:环境变量产生更多的全局效应,因为它们不仅对Java子进程可见,而且对于定义它们的进程的所有子进程都是可见的,因此环境变量更可能有意料不到的副作用。程序中应该尽可能使用系统属性,环境变量应该在需要全局效应的时候使用,或者在外部系统接口要求使用环境变量时使用(比如 PATH)。
二、环境变量Env使用 System.getenv() 获取系统的所有环境变量的Map,注意它是一个UnmodifiableCollection,是一个只读视图
环境变量并不提供set方法,即没有System.setEnvXXX()方法
public static void main(String[] args) {
Map envMap = System.getenv();
envMap.forEach((key, value) -> {
System.out.println(key + "-->" + value);
});
}
这里 getenv() 这个方法并没有遵循驼峰规范,个人认为它是一种不规范的命名方式。
下面看输出结果:
系统属性的作用范围没那么大,所以Java是允许我们用API的方式.setProperty自己设置系统属性的。
public static void main(String[] args) {
Properties properties = System.getProperties();
System.setProperty("myProperty", "自定义的系统属性~"); // 允许自定义系统属性
properties.forEach((key, value) -> {
System.out.println(key + "-->" + value);
});
}
下面看输出结果:
下面是对常用的,我们更关注的key做个总结。
环境变量:
环境变量值USERPROFILE用户目录USERDNSDOMAIN用户域PATHEXT可执行后缀JAVA_HOMEJava安装目录TEMP用户临时文件目录SystemDrive系统盘符ProgramFiles默认程序目录USERDOMAIN帐户的域的名称ALLUSERSPROFILE用户公共目录SESSIONNAMESession名称TMP临时目录Pathpath环境变量CLASSPATHclasspath环境变量PROCESSOR_ARCHITECTURE处理器体系结构OS操作系统类型PROCESSOR_LEVEL处理级别COMPUTERNAME计算机名Windir系统安装目录SystemRoot系统启动目录USERNAME用户名ComSpec命令行解释器可执行程序的准确路径APPDATA应用程序数据目录系统属性:
系统变量值java.version Java运行时环境版本java.vendor Java运行时环境供应商java.vendor.urlJava供应商的 URLjava.home Java安装目录java.vm.specification.versionJava虚拟机规范版本java.vm.specification.vendorJava虚拟机规范供应java.vm.specification.name Java虚拟机规范名称java.vm.versionJava虚拟机实现版本java.vm.vendorJava虚拟机实现供应java.vm.name Java虚拟机实现名称java.specification.versionJava运行时环境规范版本java.specification.vendorJava运行时环境规范供应商java.specification.nameJava运行时环境规范名称java.class.versionJava类格式版本号java.class.pathJava类路径java.library.path加载库时搜索的路径列表java.io.tmpdir默认的临时文件路径java.compiler要使用的 JIT编译器的名称java.ext.dirs一个或多个扩展目录的路径os.name操作系统的名称os.arch操作系统的架构os.version操作系统的版本file.separator文件分隔符path.separator路径分隔符line.separator行分隔符user.name用户的账户名称user.home用户的主目录user.dir用户的当前工作目录补充一个知识点:
我们在SpringBoot项目中的配置文件中配置的值,默认都是加载到环境变量中,我们可以使用下面的方法试试看:
person.nickName='scorpios'
ConfigurableEnvironment environment = application.getEnvironment();
String property = environment.getProperty("person.nickName")