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