2018年12月7日 星期五

Java SE 入門教學 - properties文件 和 Properties類別

更新時間:12/07/2018

前言

在我們平時寫程序的時候,有些參數是經常改變的,而這種改變不是我們預知的。比如說我們開發了一個操作數據庫的模塊,在開發的時候我們連接本地的數據庫那麼 IP、數據庫名稱、數據庫表名稱、數據庫主機等信息是我們本地的,要使得這個操作數據的模塊具有通用性,那麼以上信息就不能寫死在程序裡。通常我們的做法是用配置文件來解決。

各種語言都有自己所支持的配置文件類型。比如 Python ,它支持 .ini 文件。因為他內部有一個 ConfigParser 類來支持 .ini 文件的讀寫,根據該類提供的方法程序員可以自由的來操作 .ini 文件。而在 Java 中,Java 支持的是 .properties 文件的讀寫,java.util.Properties 類別為我們操作 .properties 文件提供了便利。

在 Java 項目中,操作 properties 文件 是經常要做的,因為很多的配置信息都會寫在 properties 文件中,這種檔案被稱為屬性資源包(Property Resource Bundles)。每個參數被儲存為一對字串:一個儲存名稱參數(被稱為「鍵」),另一個儲存值。


一、屬性資源包格式

每個 .properties 檔案中的行通常儲存單個屬性。對於每一行可能有這麼幾種格式,包括「鍵=值」、「鍵 = 值」、「鍵:值」 或 「鍵 值」。.properties 檔案可以使用數字符號(#)或驚嘆號(!)作為一行中第一個非空白字元,用來表示它後面的所有文字都是一個注釋。反斜線(\)用於跳脫字元。

# You are reading the ".properties" entry.
! The exclamation mark can also mark text as comments.
# The key and element characters #, !, =, and : are written with
# a preceding backslash to ensure that they are properly loaded.
website = http\://en.wikipedia.org/
language = English
# The backslash below tells the application to continue reading
# the value onto the next line.
message = Welcome to \
    Wikipedia\!
# Add spaces to the key
key\ with\ spaces = This is the value that could be looked up with the key "key with spaces".
# Unicode
tab : \u0009
# Using Chinese 語言 = 中文
\u8a9e\u8a00 = \u4e2d\u6587

在上面的範例中,website 是一個鍵,它對應的值是 http://en.wikipedia.org/。而數字符號(#)或驚嘆號(!)作為注釋標記文字,作為屬性的一部分時沒有什麼影響。message 鍵具有值 Welcome to Wikipedia! 而不是 Welcome to Wikipedia。另請注意,在 Wikipedia! 前面的所有空白被完全排除。

.properties 檔案的編碼是 ISO-8859-1,又稱為 Latin-1。所有非 Latin-1 字元必須利用 Unicode 跳脫字元錄入,例如\u8a9e中,8a9e 是中文字「語」的十六進位的 Unicode 編碼值。

從 Java 1.5 開始,支援 XML 格式屬性檔案,其預設是 UTF-8 編碼的,可以用來替代 Java 的 .properties 檔案。


二、Properties 類別

Properties 類別表示一組永續化(Persistence)的屬性,它可以儲存(store)到流(Stream)中或從流(Stream)中讀取(load)。

  • Properties 是 Hashtable 的子類別。
  • 它被用來維護一組鍵值對,鍵值對都是 String 型態。
  • Properties 類別的一個有用功能是,您可以指定在沒有值與某個鍵關聯時將返回的默認屬性。
  • 多個線程可以共享單個屬性對象,而無需外部同步。
load(Reader reader)
store(Writer writer, String comments)
使用簡單的字符流加載和儲存 .properties 文件屬性。
load(InputStream inStream)
store(OutputStream out, String comments)
使用字節流加載和儲存 .properties 文件屬性,但使用 ISO-8859-1 編碼格式。
如果無法在此編碼中表示的文字,必須使用 Unicode 編碼。
native2ascii 工具可用於將屬性文件轉換為其他字符編碼或從其他字符編碼轉換。
loadFromXML(InputStream in)
storeToXML(OutputStream os, String comment)
storeToXML(OutputStream os, String comment, String encoding)
使用簡單的 XML 格式加載和儲存屬性,默認使用 UTF-8 編碼。
也可以指定特定的編碼,如 UTF-16。

三、操作 .properties 文件

3.1 儲存至 .properties 文件

3.2 加載 .properties 文件

3.3 使用 getResourceAsStream() 加載 .properties 文件

靜態方法:類別名.class.getClassLoader().getResourceAsStream(".properties 文件名")

非靜態方法:getClass().getClassLoader().getResourceAsStream(".properties 文件名")


四、操作 XML 文件

4.1 儲存至 XML 文件

4.2 加載 XML 文件


五、總結

使用 Properties 類別管理永續化(Persistence)的屬性,如果使用 .properties 文件,其編碼固定使用 IOS-8859-1;如果使用 XML 文件,其預設編碼為 UTF-8,可以使用 storeToXML(OutputStream os, String comment, String encoding) 方法改變編碼格式。

取出所有"鍵"的資料,可以使用 Properties 類別的 public Enumeration<?> propertyNames() 方法,然後使用 Enumeration 類別的 hasMoreElements() 和 nextElement() 方法取出"鍵"。另外也可以使用父類別 Hashtable 的 public Set<K> keySet() 方法,加上使用 Iterator 類別取得這個集合的疊帶器,使用 Iterator 類別的 hasNext() 和 Next() 方法取出"鍵"。

取出"值",必須要有"鍵"才能取得,使用 Properties 類別的 public String getProperty(String key) 方法取得。





沒有留言:

張貼留言