一、引言

对于环境变量和系统属性,我们应该并不陌生,因为在安装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() 这个方法并没有遵循驼峰规范,个人认为它是一种不规范的命名方式。

下面看输出结果:

env设置 spark env.getproperty_Java

env设置 spark env.getproperty_环境变量_02

env设置 spark env.getproperty_环境变量_03

三、系统属性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);
    });
}

下面看输出结果:

env设置 spark env.getproperty_Java_04

env设置 spark env.getproperty_系统变量_05

env设置 spark env.getproperty_java_06

四、总结

下面是对常用的,我们更关注的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")