一、引言
对于环境变量和系统属性,我们应该并不陌生,因为在安装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<String, String> envMap = System.getenv();
envMap.forEach((key, value) -> {
System.out.println(key + "-->" + value);
});
}
这里 getenv() 这个方法并没有遵循驼峰规范,个人认为它是一种不规范的命名方式。
下面看输出结果:
三、系统属性Property
系统属性的作用范围没那么大,所以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_HOME | Java安装目录 |
TEMP | 用户临时文件目录 |
SystemDrive | 系统盘符 |
ProgramFiles | 默认程序目录 |
USERDOMAIN | 帐户的域的名称 |
ALLUSERSPROFILE | 用户公共目录 |
SESSIONNAME | Session名称 |
TMP | 临时目录 |
Path | path环境变量 |
CLASSPATH | classpath环境变量 |
PROCESSOR_ARCHITECTURE | 处理器体系结构 |
OS | 操作系统类型 |
PROCESSOR_LEVEL | 处理级别 |
COMPUTERNAME | 计算机名 |
Windir | 系统安装目录 |
SystemRoot | 系统启动目录 |
USERNAME | 用户名 |
ComSpec | 命令行解释器可执行程序的准确路径 |
APPDATA | 应用程序数据目录 |
系统属性:
系统变量 | 值 |
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 | 文件分隔符 |
path.separator | 路径分隔符 |
line.separator | 行分隔符 |
user.name | 用户的账户名称 |
user.home | 用户的主目录 |
user.dir | 用户的当前工作目录 |
补充一个知识点:
我们在SpringBoot项目中的配置文件中配置的值,默认都是加载到环境变量中,我们可以使用下面的方法试试看:
person.nickName='scorpios'
ConfigurableEnvironment environment = application.getEnvironment();
String property = environment.getProperty("person.nickName")