Java中的System.getenv()和System.getProperty()使用详解

 更新时间:2024年11月27日 08:54:43   作者:星辰鸿溟  
文章介绍了Java中用于读取环境配置信息的两种方法:System.getenv()和System.getProperty(),前者读取系统环境变量,返回一个不可修改的Map;后者获取JVM环境变量值,可以通过-D参数设置,文章还提到,通过这两种方法可以简化配置,不需要修改代码

System.getenv()和System.getProperty()是Java种常用的两种读取环境配置信息的方法,它们都是java.lang.System类的方法,用途有相似之处,但我们在实际使用中,需要更加注意二者的区别。

1. System.getenv()

System.getenv()读取的是当前系统环境的环境变量。

要深入理解环境变量的本质,需要对系统父子进程关系有更加清晰的认识。

一般来说,子进程在创建时,会将父进程当时的环境变量复制一份,而父进程中之后发生的环境变量的变动,不会影响子进程中对应的环境变量。

当不传入参数时,System.getenv()的返回值为一个只读的Map,其中包括当前环境下所有环境变量。

下面的例子中:

我们将打印出这条语句执行时环境中所有的环境变量和它们对应的值,在 windows 中是 用户环境变量和系统环境变量的值,

System.getenv().forEach((key, value) -> {
    System.out.println(key + ":" + value);
});

注意:通过 System.getenv() 获取的 Map 是不支持修改的,为了有更深入的理解,我们熟悉下这块的代码

  public static java.util.Map<String,String> getenv() {
      // ......
      return ProcessEnvironment.getenv();
  }

ProcessEnvironment.getenv() 该方法的核心逻辑如下,从以下代码中可以看出,返回的 map 是通过Collections.unmodifiableMap() 处理的,因此,返回的map 是不能被修改的。

final class ProcessEnvironment extends HashMap<String,String>{
    private static final Map<String,String> theUnmodifiableEnvironment;
    static {
        theEnvironment  = new ProcessEnvironment();
		theUnmodifiableEnvironment
           	 = Collections.unmodifiableMap(theEnvironment);
    }
    // Only for use by System.getenv()
    static Map<String,String> getenv() {
        return theUnmodifiableEnvironment;
    }
}

一般我们在程序中使用时,一般不会获取全部的系统环境变量,因而可以通过 System.getEnv(key) 获取对应环境变量的值。

 public static String getenv(String name) {
     // .....
     return ProcessEnvironment.getenv(name);
 }

2. System.getProperty()

通上,通过 System.getProperty(key)获取单个变量值,通过System.getPropertys() 获取所有 JVM 环境变量值。

如下:

System.getProperties().forEach((k,v) -> {
    System.out.println(k + "=" + v);
});

这里列出一些常见的

// classpath
sun.boot.class.path=C:\Program Files\Java\jdk1.8.0_131\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\rt.jar;....
java.library.path=C:\Program Files\Java\jdk1.8.0_131\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;
file.separator=\
sun.jnu.encoding=GBK
java.version=1.8.0_131
java.vm.info=mixed mode

当我们通过 启动JVM时,可以通过 -D 设置JVM 环境变量值,在我们的程序中我们也可以通过,System.setProperty(key,value) 设置JVM 环境变量,该值在整个JVM 间是共享的。

使用场景

最近线上大数据 Hadoop 集群开启了Kerberos,为了让业务尽量不改动代码的原则。

通过 System.getenv()System.getenv() 实现了业务代码零改动下,使用开启Kerberos后的集群。

总结

通过 System.getenv()getProperty() 可以简化我们的有些配置,相比于 xml 等配置文件。

这种方式更轻量,如果我们的程序中没有配置文件,但想使某一两项功能实现可配置,通过System.getenv()getProperty()可以非常容易的实现。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • springboot @ConfigurationProperties和@PropertySource的区别

    springboot @ConfigurationProperties和@PropertySource的区别

    这篇文章主要介绍了springboot @ConfigurationProperties和@PropertySource的区别,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Dubbo负载均衡策略介绍

    Dubbo负载均衡策略介绍

    负载均衡改善了跨多个计算资源(例如计算机,计算机集群,网络链接,中央处理单元或磁盘驱动的的工作负载分布。负载平衡旨在优化资源使用,最大化吞吐量,最小化响应时间,并避免任何单个资源的过载
    2022-09-09
  • 详解Jmeter中的BeanShell脚本

    详解Jmeter中的BeanShell脚本

    BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法,所以它和java是可以无缝衔接的,学了Java的一些基本语法后,就可以来在Jmeter中写写BeanShell脚本了
    2021-12-12
  • Java算法之BFS,DFS,动态规划和贪心算法的实现

    Java算法之BFS,DFS,动态规划和贪心算法的实现

    广度优先搜索(BFS)和深度优先搜索(DFS)是图遍历算法中最常见的两种算法,主要用于解决搜索和遍历问题。动态规划和贪心算法则用来解决优化问题。本文就来看看这些算法的具体实现吧
    2023-04-04
  • add方法理解ArrayList的扩容机制

    add方法理解ArrayList的扩容机制

    这篇文章主要为大家介绍了add方法理解ArrayList的扩容机制示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • Java 模拟真正的并发请求详情

    Java 模拟真正的并发请求详情

    有时需要测试一下某个功能的并发性能,又不要想借助于其他工具,索性就自己的开发语言,来一个并发请求就最方便了。下文我们就来学习Java 如何模拟真正的并发请求
    2021-09-09
  • Java你不了解的大数型BigInteger与BigDecimal类

    Java你不了解的大数型BigInteger与BigDecimal类

    这篇文章主要介绍了Java 处理超大数类型之BigInteger与BigDecimal案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2022-05-05
  • 详解SpringMVC注解@initbinder解决类型转换问题

    详解SpringMVC注解@initbinder解决类型转换问题

    本篇文章主要介绍了详解SpringMVC注解@initbinder解决类型转换问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • 详解spring cloud中使用Ribbon实现客户端的软负载均衡

    详解spring cloud中使用Ribbon实现客户端的软负载均衡

    这篇文章主要介绍了详解spring cloud中使用Ribbon实现客户端的软负载均衡,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • Java的JSON转换库GSON的基本使用方法示例

    Java的JSON转换库GSON的基本使用方法示例

    GSON是Google制作的一个可以让Java对象与JSON互相转换的类库,下面我们就来看一下Java的JSON转换库GSON的基本使用方法示例:
    2016-06-06

最新评论