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 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM