Java基础—System.getProperties()及System.getenv()(属性与环境变量)

概述

java.lang包在java应用程序中是自动引入的。这个包含很多常用的类,从NullPointerException到Object、Math以及String。

java.lang.System类是一个私有类,意味着它没有子类(因为final的类不能被继承),并且所有的方法都是静态的。

System.getProperties()以及System.getevn()就是java.lang.System类中的两个静态方法。

System.getProperties()及System.getProperty()——属性

Java平台使用属性对象提供有关于本地系统信息及配置信息,我们称之为系统属性。

系统属性包括的信息,比如当前用户、当前Java运行时的版本以及文件路径名分隔符等等。

获取系统属性信息有两种方式:

1、使用System.getProperty(String proertyName)

//获取java.home对应的属性值
System.getProperty("java.home")

这种方法需要预先知道属性名,如果我们不知道属性名,想查看所有支持的属性有哪些的话,可以使用下面的方法。

2、使用System.getProerptes()

//将System.getProperties()的返回值进行Map类型的强转
Map map = (Map)System.getProperties();

//打印出所有支持的属性名及值
Set<String> keySet = map.keySet();
for(String key : keySet){
        System.out.println(key + "|" + map.get(key));
}
System.out.println(map.get("java.home"));

System.getenv()——环境变量

类似于属性文件的键/值对的环境变量。许多操作系统使用环境变量,将配置信息传递到应用系统内部。

设置环境变量的方法对于不同的操作系统是有不同的区别的。比如,在Windows中,我们使用来自于控制面板中的系统工具应用程序来设置环境变量的,而在Unix或Linux中,我们使用shell脚本来完成。

当我们创建一个进程,它会默认的从它的父进程继承一个环境的克隆。

我们使用下面的代码打印出所有环境变量:

获取单个属性
System.getenv("PUBLIC");
或
//打包出所有的属性
System.getenv().forEach((k, v) -> {
        System.out.println(k + "|" + v);
});
或
Map map = (Map)System.getenv();

Set<String> keySet = map.keySet();
for(String key : keySet){
        System.out.println(key + "|" + map.get(key));
}

getenv()返回一个只读的Map。尝试添加一个新的值到map中会报UnSupportedOperationException的异常。

另一方法,我们可以从我们的应用程序创建一个其他进程,并且向这个进程的环境中添加的新的变量。

在Java中创建一个新的进程,我们可以使用ProcessBuilder类,它有一个名为environment的方法。这个方法返回一个Map,但是这个时间的Map不是只读的,意味着我们可以对它进行扩展。

ProcessBuilder processBuilder = new ProcessBuilder(args);
Map<String,String> env = processBuilder.environment();
env.put("myName","liyanqiao");
Process process = processBuilder.start();

env与properties的区别

尽管他们本质上都是map,提供字符串类型的键与值,但是他们还是有区别的。

1、我们可以在运行时更新属性;而环境变量是操作系统变量的一个永恒拷贝。

2、属性只包含在Java平台中;而环境变量是处在整个操作系统层面的,对于运行在同一机器上的所有应用程序都是有效的。

3、在打包应用程序时,属性是必须存在;但是我们可以在操作系统的任何地方创建环境变量。

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注