专栏首页BAT的乌托邦【小家Java】Java环境变量(Env)和系统属性(Property)详解---工具文章

【小家Java】Java环境变量(Env)和系统属性(Property)详解---工具文章

前言

首先说明,这是一篇工具文章,主要记录下我们Java环境变量和系统属性,方便以后的查阅。

当程序中需要使用与操作系统相关的变量(例如:文件分隔符、换行符)时,Java提供了System类的静态方法getenv()getProperty()用于返回系统相关的环境变量系统属性

  • getenv方法返回的变量大多与操作系统相关
  • getProperty方法返回的变量大多与java程序有关

系统属性和环境变量都是key-value形式的。两种机制能用来将用户定义的信息传递给 Java进程。

  • 环境变量产生更多的全局效应,因为它们不仅对Java子进程可见,而且对于定义它们的进程的所有子进程都是可见的。在不同的操作系统上,它们的语义有细微的差别,比如,不区分大小写。

因此环境变量更可能有意料不到的副作用。程序中尽可能使用系统属性。环境变量应该在需要全局效应的时候使用,或者在外部系统接口要求使用环境变量时使用(比如 PATH)

Demo

环境变量Env

使用System.getenv()获取系统的所有环境变量的Map,注意它是一个UnmodifiableCollection,是一个只读视图

环境变量并不提供set方法,即没有System.setEnv…方法

    public static void main(String[] args) {
        Map<String, String> envMap = System.getenv();
        envMap.forEach((key, value) -> {
            System.out.println(key + "=" + value);
        });
	}

小吐槽一句:getenv()这个方法并没有遵循驼峰规范,个人认为它是一种不规范的命名方式。Java.awt中有一个类(我记不太清楚了)所有方法命名都没遵循驼峰,后来在1.1里就被另外一个类代替,自己被标记为过时了,课件JDK对标准的重视~~

下面看输出结果,然后做解释如下:

系统属性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 &nbsp;&nbsp;:Java安装目录
java.vm.specification.version: Java虚拟机规范版本
java.vm.specification.vendor :Java虚拟机规范供应商
java.vm.specification.name &nbsp; :Java虚拟机规范名称
java.vm.version :Java虚拟机实现版本
java.vm.vendor :Java虚拟机实现供应商
java.vm.name&nbsp; :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中"/env"端点的访问结果:

飘红的两处就是对应着咱们本文的一些值。(可以看出它哥俩的优先级还是相对来说比较高的,比我们自定的配置文件application.properties的优先级高)

总结

这边文章的意义一方面是作为工具文章,方便查阅。另一方面是为了解Spring的环境、属性配置机制做铺垫,让能有个更快的了解。

其实Spring对环境变量、配置管理的了解程度,将直接影响到你对SpringBootSpring Cloud的深入学习,因为它哥俩基本上靠配置驱动了非常多的东西。比如Endpoint、Actuator、Enviroment等等,而环境变量和系统属性是在此处、甚至在Maven中必不可少的一环~

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 怎样成为全栈开发工程师[每日前端夜话0xAA]

    在 LinkedIn 和 Facebook 上,有很多人将当前的工作标记为全栈工开发程师。在 Medium 上关于这个问题的文章也收到了很多读者的好评。一些人认...

    疯狂的技术宅
  • 再也不敢使用集合默认初始化值了

    集合初始化通常进行分配容量、设定特定参数等相关工作。我们以使用频率相对较高的ArrayList和HashMap为例,简要说明初始化的相关工作,并解释为什么在任何...

    用户4143945
  • Iterator 、Generator(一)

    调用Generator函数,返回一个遍历器对象,代表Generator函数的内部指针。以后,每次调用遍历器对象的next方法,就会返回一个有着value和don...

    用户3258338
  • Java性能优化的50个细节,我必须分享给你!

    来源:blog.csdn.net/dongnan591172113/article/details/51790428

    用户5224393
  • Java 12 骚操作, String居然还能这样玩!

    栈长之前在Java技术栈微信公众号分享过《Java 11 已发布,String 还能这样玩!》这篇文章,介绍了 Java 11 的 String 新玩法,让大家...

    Java技术栈
  • 如何用Python编写一个Lisp解释器

    这篇文章有两个目的:一是展示如何实现一个计算机语言的解释器,二是演示如何使用 Python 3 构造 Lisp 的一种方言 Schema,作者把自己的这个语言解...

    AI科技大本营
  • 顺丰&百度 前端 一面 面经

    2.数据库的选择,redis和其他数据库怎么同步(简历写了敲过java。。然后自己给自己挖了个坑。。。)

    牛客网
  • Elasticsearch BulkProcessor 的具体实现

    本文示例使用的是 Spring Boot 框架,由于该框架有默认的 Elasticsearch 版本,为了避免版本混乱或冲突,我在 pom.xml 文件内添加了...

    create17
  • JAVAAPI中SortedMap解释

    A Map进一步提供其键上的总排序 。地图根据其键的natural ordering或通过在分类地图创建时提供的Comparator进行排序。当迭代排序的地图的...

    技术从心
  • 美团大规模微服务通信框架及治理体系OCTO核心组件开源

    微服务通信框架及治理平台OCTO作为美团基础架构设施的重要组成部分,目前已广泛应用于公司技术线,稳定承载上万应用、日均支撑千亿级的调用。业务基于OCTO提供的标...

    美团技术团队

扫码关注云+社区

领取腾讯云代金券