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()可以非常容易的实现。

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

相关文章

  • MyBatis事务原理与实战深入解析

    MyBatis事务原理与实战深入解析

    本文详细解析了MyBatis事务的原理、配置与企业级实战应用,从核心基础到原生JDBC事务和Spring声明式事务的实现,再到常见问题与解决方案,全面涵盖了MyBatis事务的各个方面,帮助开发者深入理解并正确使用MyBatis事务,感兴趣的朋友跟随小编一起看看吧
    2025-12-12
  • Java中excel表数据的批量导入方法

    Java中excel表数据的批量导入方法

    这篇文章主要为大家详细介绍了Java中excel表数据的批量导入方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • SpringAOP如何修改请求参数列表

    SpringAOP如何修改请求参数列表

    这篇文章主要介绍了SpringAOP如何修改请求参数列表问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • Spring Security 7 响应头配置方法及其解决方案

    Spring Security 7 响应头配置方法及其解决方案

    本文详细介绍了Spring Security中的HTTP安全响应头配置方法,重点分析了X-Frame-Options响应头冲突问题及其解决方案,感兴趣的朋友跟随小编一起看看吧
    2026-01-01
  • 查找jdk安装路径并且切换多版本jdk的详细步骤

    查找jdk安装路径并且切换多版本jdk的详细步骤

    在日常的工作学习中可能需要用到不同版本的jdk,下面这篇文章主要给大家介绍了关于查找jdk安装路径并且切换多版本jdk的详细步骤,文中介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • Java利用Spire.Doc for Java实现Word转 PCL打印格式

    Java利用Spire.Doc for Java实现Word转 PCL打印格式

    在日常的企业级开发中,文档处理是一个绕不开的话题,本文将介绍如何在 Java 后端环境中,利用 Spire.Doc for Java 库,在不依赖 Microsoft Office 软件的情况下,实现 Word 文档到 PCL 格式的转换,感兴趣的可以了解下
    2026-04-04
  • SpringMVC 异常处理机制与自定义异常处理方式

    SpringMVC 异常处理机制与自定义异常处理方式

    这篇文章主要介绍了SpringMVC 异常处理机制与自定义异常处理方式,具有很好的开车价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Java对文件的随机读写以及压缩处理操作

    Java对文件的随机读写以及压缩处理操作

    这篇文章主要介绍了Java对文件的随机读写以及压缩处理操作,是Java入门学习中的基础知识,需要的朋友可以参考下
    2015-10-10
  • java实现画图板功能

    java实现画图板功能

    这篇文章主要为大家详细介绍了java实现画图板功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-09-09
  • Java for循环Map集合优化实现解析

    Java for循环Map集合优化实现解析

    这篇文章主要介绍了Java for循环Map集合优化实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01

最新评论