Java System.getProperty vs System.getenv
1.简介
在Java应用程序中时,包java.lang会自动导入。该程序包包含从NullPointerException到Object,Math和String的许多常用类。
java.lang.System类是最终类,这意味着我们无法对其进行子类化,因此所有方法都是静态的。
我们将研究读取系统属性和环境变量的两种System方法之间的区别。
这些方法是getProperty和getenv。
2.使用System.getProperty()
Java平台使用Properties对象来提供有关本地系统和配置的信息,我们将其称为System Properties。
系统属性包括诸如当前用户,Java运行时的当前版本以及文件路径名分隔符之类的信息。
在下面的代码中,我们使用System.getProperty(" log_dir")读取属性log_dir的值。我们还使用默认值参数,因此,如果该属性不存在,则getProperty返回/ tmp / log:
要在运行时更新系统属性,请使用System.setPropertymethod方法:
1 |
我们可以使用propertyName命令行参数将自己的属性或配置值传递给应用程序,格式为:
1 | java -jar jarName -DpropertyName=value |
在app.jar中将foo的属性设置为bar的值:
java -jar app -Dfoo =" bar"
System.getProperty将始终返回字符串。
3.使用System.getenv()
环境变量是键/值对,例如"属性"。许多操作系统使用环境变量来允许将配置信息传递到应用程序中。
设置环境变量的方式因操作系统而异。例如,在Windows中,我们从控制面板使用System Utility应用程序,而在Unix中,我们使用shell脚本。
创建进程时,默认情况下,它会继承其父进程的克隆环境。
以下代码段显示了使用lambda表达式打印所有环境变量。
getenv()返回仅限区域的Map。尝试向地图添加值会引发UnsupportedOperationException。
要获取单个变量,请使用变量名称调用getenv:
另一方面,我们可以从应用程序中创建另一个进程,并将新变量添加到其环境中。
要使用Java创建新流程,我们使用ProcessBuilder类,该类具有一种称为环境的方法。此方法返回一个Map,但是这次映射不是只读的,这意味着我们可以向其中添加元素:
1 2 3 4 |
4.差异
尽管两者本质上都是为String键提供String值的映射,但让我们看一些区别:
当环境变量是操作系统变量的不可变副本时,我们可以在运行时更新属性。
属性仅包含在Java平台内,而环境变量在操作系统级别是全局的-可供同一计算机上运行的所有应用程序使用。
打包应用程序时,属性必须存在,但是我们几乎可以在操作系统上创建环境变量。
5.结论
尽管在概念上相似,但是属性和环境变量的应用都大不相同。
选项之间的选择通常是范围的问题。使用环境变量,可以将同一应用程序部署到多台计算机上以运行不同的实例,并且可以在操作系统级别甚至在AWS或Azure控制台中进行配置。无需重建应用程序即可更新配置。
始终记住,getProperty遵循驼峰式约定,而getenv则不遵循。