Java> Properties属性映射,与读取系统属性System.getProperties()
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