首页 > 技术文章 > Java> Properties属性映射,与读取系统属性System.getProperties()

fortunely 2020-11-25 20:37 原文

1. Properties属性映射

1.1 属性映射 Property Map

属性映射是一个类型特殊的映射结构,通常用于程序的特色配置选项,具有3个特点:

  • 键与值都是字符串
  • 表可以保存到一个文件,也可以从文件加载
  • 使用一个默认的辅助表

Properties类实现Java属性映射。

 

1.2 属性映射重要API

// java.util.Properties 1.0
Properties()
// 创建一个空的属性映射

Properties(Properties default)
// 创建一个带有一组默认值的空的属性映射

String getProperty(String key)
// 获取属性的对应关系,返回键key对应的属性值(String字符串)。如果映射不存在,返回默认表中与这个key对应的字符串

String getProperty(String key, String defaultValues)
// 获得在键找到时具有的默认值属性,返回与键key对应属性值(String字符串)。如果映射不存在,返回默认字符串

void load(InputStream in)
// 从InputStream加载属性映射

void store(OutputStream out, String commentString)
// 把属性保存到OutputStream

 

1.3 属性映射的读写

Properties settings = new Properties();
// 写属性映射
settings.setProperty("username", "张三");
settings.setProperty("age", "20");

// 读取属性映射
String name = settings.getProperty("username");
String age = settings.getProperty("age");

// 测试 - 打印读取的属性映射
System.out.println(name);
System.out.println(age);

 

1.4 属性映射文件的保存、加载

1)保存属性映射文件

// 保存属性映射settings到文件"program.properties"     
OutputStream out = new FileOutputStream("program.properties");
        settings.store(out, "Program Properties");


// UTF-8 编码方式保存属性映射settings到文件"program.properties"  
        OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream("program.properties"), "UTF-8");
        settings.store(out, "Program Properties");

保存后,会得到新文件program.properties,其内容:

#Program Properties
#Fri Jan 08 17:38:39 CST 2021
age=20
username=\u5F20\u4E09

 

2)加载属性映射文件

// 具体编码方式一般根据实际情况选择, 保存的时候用的什么编码方式, 加载的时候就用同样编码方式
// 从文件加载属性映射到settings
InputStream in = new FileInputStream("program.properties");
settings.load(in);

// 以utf-8编码方式, 从文件加载到属性映射settings
InputStreamReader in2 = new InputStreamReader(new FileInputStream("program.properties"), "UTF-8");
settings.load(in2);

// 读取属性映射
String name = settings.getProperty("username");
String age = settings.getProperty("age");

// 测试 - 打印读取的属性映射
System.out.println(name);
System.out.println(age);

 

2. 读取系统属性System.getProperties()

2.1 系统属性

如果想要在程序中,动态获取当前JVM版本,要怎么办?

如果想要获得系统(Unix/ Windows)文件分隔符,到底是 “/” 还是 "\",要怎么办?

如果想要获取操作系统的名称、版本等信息,要怎么办?

如果想要获取JDK路径,要怎么办?

如果想要获取用户主目录,要怎么办?

如果想要获取软件当前工作路径,要怎么办?

 

2.2 System.getProperties()

Java中System类的getProperties()方法,能帮你解决这一切。

 

从函数的原型注释中,知道该函数决定了当前系统属性。 有一个安全管理器,它的checkPropertiesAccess方法无参数调用,可能导致安全异常。

当前系统属性集通过getProperty(String)方法使用,返回值就包含了属性对象。

如果没有当前系统属性集,首先就会创建并初始化一个。

 

System.getProperties() 原型

/**
* Determines the current system properties.
* <p>
* First, if there is a security manager, its
* <code>checkPropertiesAccess</code> method is called with no
* arguments. This may result in a security exception.
* <p>
* The current set of system properties for use by the
* {@link #getProperty(String)} method is returned as a
* <code>Properties</code> object. If there is no current set of
* system properties, a set of system properties is first created and
* initialized.
* ...
*/
public static Properties getProperties() {
  SecurityManager sm
= getSecurityManager(); if (sm != null) {   sm.checkPropertiesAccess(); } return props;
}

 

获取某个属性的方法,比如java版本信息

Properties props = System.getProperties();

props.getProperty("java.version");

 

通过System.getProperties(),还能获取什么信息?

通过查看System源码,可以看到getProperties() 注释中,还包含了以下这些keys信息

相关值的描述
java.version Java 运行时环境版本
java.vendor Java 运行时环境供应商
java.vendor.url Java 供应商的 URL
java.home Java 安装目录
java.vm.specification.version Java 虚拟机规范版本
java.vm.specification.vendor Java 虚拟机规范供应商
java.vm.specification.name Java 虚拟机规范名称
java.vm.version Java 虚拟机实现版本
java.vm.vendor Java 虚拟机实现供应商
java.vm.name 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 文件分隔符(在 UNIX 系统中是“/”)
path.separator 路径分隔符(在 UNIX 系统中是“:”)
line.separator 行分隔符(在 UNIX 系统中是“/n”)
user.name 用户的账户名称
user.home 用户的主目录
user.dir 用户的当前工作目录

2.3 系统属性测试示例

public static void main(String[] args) {
    Properties props = System.getProperties();//系统属性
    System.out.println("Java的运行环境版本:" + props.getProperty("java.version"));
    System.out.println("Java的运行环境供应商:" + props.getProperty("java.vendor"));
    System.out.println("Java供应商的URL:" + props.getProperty("java.vendor.url"));
    System.out.println("Java的安装路径:" + props.getProperty("java.home"));
    System.out.println("Java的虚拟bai机规范版本:" + props.getProperty("java.vm.specification.version"));
    System.out.println("Java的虚拟机规范供应商:" + props.getProperty("java.vm.specification.vendor"));
    System.out.println("Java的虚拟机规范名称:" + props.getProperty("java.vm.specification.name"));
    System.out.println("Java的虚拟机实现版本:" + props.getProperty("java.vm.version"));
    System.out.println("Java的虚拟机实现供应商:" + props.getProperty("java.vm.vendor"));
    System.out.println("Java的虚拟机实现名称:" + props.getProperty("java.vm.name"));
    System.out.println("Java运行时环境规范版本:" + props.getProperty("java.specification.version"));
    System.out.println("Java运行时环境规范供应商:" + props.getProperty("java.specification.vender"));
    System.out.println("Java运行时环境规范名称:" + props.getProperty("java.specification.name"));
    System.out.println("Java的类格式版本号:" + props.getProperty("java.class.version"));
    System.out.println("Java的类路径:" + props.getProperty("java.class.path"));
    System.out.println("加载库时搜索的路径列表:" + props.getProperty("java.library.path"));
    System.out.println("默认的临时文件路径:" + props.getProperty("java.io.tmpdir"));
    System.out.println("一个或多个扩展目录的路径:" + props.getProperty("java.ext.dirs"));
    System.out.println("操作系统的名称:" + props.getProperty("os.name"));
    System.out.println("操作系统的构架:" + props.getProperty("os.arch"));
    System.out.println("操作系统的版本:" + props.getProperty("os.version"));
    System.out.println("文件分隔符:" + props.getProperty("file.separator")); //unix是"/" , Windows是 "\"
    System.out.println("路径分隔符:" + props.getProperty("path.separator")); //unix是":", windows是 ";"
    System.out.println("行分隔符:" + props.getProperty("line.separator"));   //unix是"\n", windows是 "\r\n"
    System.out.println("用户的账户名称:" + props.getProperty("user.name"));
    System.out.println("用户的主目录:" + props.getProperty("user.home"));
    System.out.println("用户的当前工作目录:" + props.getProperty("user.dir"));

}

 

运行结果

Java的运行环境版本:1.8.0_181
Java的运行环境供应商:Oracle Corporation
Java供应商的URL:http://java.oracle.com/
Java的安装路径:C:\Program Files\Java\jdk1.8.0_181\jre
Java的虚拟bai机规范版本:1.8
Java的虚拟机规范供应商:Oracle Corporation
Java的虚拟机规范名称:Java Virtual Machine Specification
Java的虚拟机实现版本:25.181-b13
Java的虚拟机实现供应商:Oracle Corporation
Java的虚拟机实现名称:Java HotSpot(TM) 64-Bit Server VM
Java运行时环境规范版本:1.8
Java运行时环境规范供应商:null
Java运行时环境规范名称:Java Platform API Specification
Java的类格式版本号:52.0
Java的类路径:C:\Program Files\Java\jdk1.8.0_181\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\rt.jar;F:\workspace\IDEA\Java_Core2\out\production\Java_Core2;E:\Program Files\JetBrains\IntelliJ IDEA 202002\lib\idea_rt.jar
加载库时搜索的路径列表:C:\Program Files\Java\jdk1.8.0_181\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;E:\Python\Python37\Scripts\;E:\Python\Python37\;C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program Files\Java\jdk1.8.0_181\bin;C:\WINDOWS\System32\OpenSSH\;C:\Program Files\dotnet\;C:\Program Files (x86)\National Instruments\Shared\LabVIEW CLI;E:\Program Files\TortoiseGit\bin;E:\Program Files\Git\cmd;E:\Program Files\TortoiseSVN\bin;E:\MinGW\bin;C:\Program Files\Intel\WiFi\bin\;C:\Program Files\Common Files\Intel\WirelessCommon\;E:\Program Files\UltraEdit;C:\Program Files\Java\jdk1.8.0_181\jre\bin;C:\Program Files\MySQL\MySQL Shell 8.0\bin\;C:\Program Files\Intel\WiFi\bin\;C:\Program Files\Common Files\Intel\WirelessCommon\;C:\Users\Martin\AppData\Local\Microsoft\WindowsApps;E:\Programs\Microsoft VS Code\bin;E:\Program Files (x86)\SSH Communications Security\SSH Secure Shell;E:\Program Files\JetBrains\IntelliJ IDEA 2020.2\bin;;;.
默认的临时文件路径:C:\Users\Martin\AppData\Local\Temp\
一个或多个扩展目录的路径:C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext;C:\WINDOWS\Sun\Java\lib\ext
操作系统的名称:Windows 10
操作系统的构架:amd64
操作系统的版本:10.0
文件分隔符:\
路径分隔符:;
行分隔符:

用户的账户名称:Martin
用户的主目录:C:\Users\Martin
用户的当前工作目录:F:\workspace\IDEA\Java_Core2

 

如果万一忘记了具体的key,或者懒得根据某个key去查询系统属性,不妨试下下面这个方法,可以一次打印所有系统属性:

System.getProperties() .list(System.out);

 

ref

1. https://www.cnblogs.com/ooo0/p/11419839.html 

2. https://blog.csdn.net/weixin_41999297/article/details/106751353 

推荐阅读