【Java】設定檔概念,Java對設定檔的操作
*.ini、*.properties、*.xml都是設定檔,這些設定檔往往被奉若神明,自從我們接觸電腦的那一天開始,就被人警告不要亂弄他們。其實他們與java的HashMap結構是一樣的,都是一個存放key-value對的容器,只是設定檔那些是屬性與屬性值的key-value對罷了,HashMap不懂是啥的同志可以參考我之前寫的《【Java】Java中的Collections類——Java中升級版的資料結構》(點擊開啟連結),但是為何不能亂碰它呢?因為這些key-valueyi對一般是記錄著程式啟動並執行參數,而且很多是初始化的參數,一般這些參數都是自程式的開始運行,也就是程式的出生到程式被關閉,也就是程式死亡都需要使用的定值。正如我們每一個人的名字、性別、出生地這些屬性一樣,從我們出生到死亡都要不停地用。
設定檔主要有三種尾碼名,在Windows系統中是*.ini,*.ini在很多win32程式大家都見過了,這東西還被貼上“系統檔案”的標籤,刪除或者什麼的會被Windows警告,其實它只不過是設定檔似的,閱讀完本文之後,你就會覺得設定檔就是那回事。設定檔在Linux系統或者在一些Java工程中的是則是*.properties,最常見的就是現在很火的SSH的國際化檔案,就是以設定檔為國際化的發起點的。
其實*.ini與*.properties是完全一樣的東西,正如*.dll與*.jar的對應關係一樣,都是win32程式或者java程式必要的運行庫。*.dll沒有寫過大型win32程式的人可能不熟悉,但是*.jar大家肯定知道,很多java程式的編寫必須放進一些*.jar包使得開發更加便捷,然後你的java工程運行必須帶著這些*.jar包才能運行。大家也可以觀察到大部分win32程式在目錄下都存在*.dll,那是因為這些win32在編寫時候就用到這些*.dll包啊!相當與java的外掛程式。
此外還有一種新型的設定檔.xml,這東西相信大家也不陌生,在Jsp工程的總設定檔web.xml你弄不好,就別想啟動工程。為什麼說*.xml是新型的設定檔,還有一些*.xml是新時代的產物的觀點呢?那是因為*.ini,*.properties是不支援中文的,而*.xml是支援中文的。
在Java中操作設定檔非常簡單,正如操作一個HashMap一樣簡單,設定檔類Properties同樣在java.util.*包裡面,同時涉及檔案的讀寫操作,所以同樣需要java.io.*,對於Java輸入輸出不瞭解的讀者,可以參考我之前寫的《【Java】輸入與輸出與JDK1.5之後的新型字串StringBuilder》(點擊開啟連結)。見如下的程式:
import java.io.*;import java.util.*;public class propertiesTest {public static void main(String[] args) throws IOException {// 同樣先初始化Properties類// 初始化之後在記憶體就出現一個儲存key-value對的properties對象Properties properties = new Properties();// 之後設定三個屬性,可以與HashMap的put方法做類比,同樣是在操作key-value對// 故意設定一個中文的value來說明*.ini,*.properties與*.xml之間對中文的支援properties.setProperty("username", "aaa");properties.setProperty("chinese", "中文");properties.setProperty("password", "123");// 此時,記憶體中的properties對象便有三個key-value對// 利用store方法與storeToXML方法把記憶體中的properties對象記錄的屬性儲存到磁碟中的設定檔// 方法僅支援檔案輸出資料流對象,單單一個檔案對象File是行不通的// 第二個參數是此設定檔的注釋properties.store(new FileOutputStream("c:\\a.ini"), "中文");properties.store(new FileOutputStream("c:\\a.properties"), "comment");properties.storeToXML(new FileOutputStream("c:\\a.xml"), "注釋");// 清空properties對象properties = new Properties();// 再把c:\a.ini裡面存放的屬性讀取進來properties.load(new FileInputStream("c:\\a.ini"));// 修改password屬性的值變成456properties.put("password", "456");// 列印此時記憶體中的properties對象System.out.println(properties);// 如下方法,可以取得記憶體中的properties對象中的username的屬性值System.out.println(properties.getProperty("username"));// 再清空properties對象,讀取c:\a.xml設定檔所儲存的屬性,注意讀*.xml方法是不同properties = new Properties();properties.loadFromXML(new FileInputStream("c:\\a.xml"));// 列印記憶體中的屬性System.out.println(properties);}}
程式運行之後,在控制台會輸出如下東西:
在C盤會得到三個設定檔a.ini,au.properties與a.xml,
a.ini與a.properties的內容除注釋之外,其餘部分都是一樣的,以下是a.ini的內容,
可以看到,這個a.ini這種舊式的設定檔根本就不支援中文,Java中Properties類的store方法只能把中文幫你轉碼儲存,注意與運行結果比對,load方法並不讀取注釋,使用load把這些屬性讀回來程式之後無需轉碼就顯示正常。因此struts國際化的時候可以利用Properties類去轉碼與輸出,根本就不用用到什麼工具,Java本來就有相應的方法。作為程式的設定檔一般是儲存重要的資訊的,並不需要給使用者看的,因此,屬性值一般只是一些數字之類的。
而a.xml的內容則非常豐富,具體如下:
<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"><properties><comment>注釋</comment><entry key="password">123</entry><entry key="chinese">中文</entry><entry key="username">aaa</entry></properties>
但Properties對象的loadFromXML方法的讀取僅僅是讀取其中的key-value的程式對,對比運行結果,
你可以看到,都是以屬性與屬性值的key-value對來讀取的。
通過上面對設定檔概念的解釋與Java對設定檔的操作,估計大家已經基本掌握*.ini、*.properties、*.xml這些設定檔到底是啥,也可以看到這些設定檔的基本結構了。