Java.util.Properties和dom4j讀寫.properties和.xml

一、.properties文件的讀寫

什麼是.properties文件?簡單來說.properties文件就是java中用於存放一些配置的文件,這些配置以鍵值對(key=value)形式存放,文件名後綴以.properties結尾。

看一下項目中常見的jdbc.properties文件:

<code>jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/helloJava
jdbc.usename=root
jdbc.password=root/<code>

Java中常用java.util.Properties類來處理.properties文件。下面,我們用Java代碼來演示一下這個jdbc.properties的創建、讀寫。

代碼中主要包括:createProp()、setProp()和readPorp()方法。

1.createProp()通過字符流一次性地輸入並創建了jdbc.properties文件;

<code>public class useProperties  {
private static String userpath = System.getProperty("user.home");
private static String configStr = "jdbc.driver=com.mysql.jdbc.Driver\\n" +
"jdbc.url=jdbc:mysql://localhost:3306/helloJava\\n" +
"jdbc.username=root\\njdbc.password=root";

public static void createProp (String data,String path){
File f = new File(path);
try(FileWriter fr = new FileWriter(f)){
char[] cs = data.toCharArray();
fr.write(cs);
System.out.println("jdbc.properties文件已創建成功!路徑是:" + path);
} catch(IOException e){
e.printStackTrace();
}
}/<code>

2.setProp() 通過Properties p = new Properties(); p.setProperty()和p.store()的方式,逐個輸入key和value值的方式向jdbc.properties文件寫入新的鍵值對(覆蓋掉原文件)。

<code>public static void setProp(String path){
Properties p = new Properties();
String url = "jdbc:mysql://localhost:3306/helloLyon";
String driver = "org.gjt.mm.mysql.Driver";
String username = "root";
String password = "admin";
try (InputStream fis = new FileInputStream(path);
OutputStream fos = new FileOutputStream(path)) {
//準備文件輸入流fis和文件輸出流fos
p.load(fis);
//加載輸入流到Properties對象p
p.setProperty("jdbc.url",url);
p.setProperty("jdbc.driver",driver);
p.setProperty("jdbc.username",username);
p.setProperty("jdbc.password",password);
//輸出流存至p
p.store(fos,"更新鍵值對");
System.out.println("新的鍵值對已成功寫入文件:" + path);
} catch (IOException e) {
e.printStackTrace();
}
}/<code>

3.readProp()方法演示了用for循環遍歷所有key-value。當然,除了遍歷所有的key-value還可以用getProperty()方法來獲取指定key的value值。

<code>public static void readProp(String path){
Properties p = new Properties();
try (BufferedReader bf = new BufferedReader(new FileReader(path))){
//讀取方式有多種,此處也可以用:FileInputStream fs = new FileInputStream(path)...
p.load(bf);
System.out.println("\\n用for循環查看所有的key——value信息:");
for (Object key : p.keySet()) {
System.out.println(key + "=" + p.get(key));
}
} catch (IOException e) {
e.printStackTrace();
}

}/<code>

完整代碼及運行結果如下:

Java.util.Properties和dom4j讀寫.properties和.xml

運行後生產的jdbc.properties文件如下:

Java.util.Properties和dom4j讀寫.properties和.xml

二、.xml文件的讀寫

最初,XML 語言僅僅是意圖用來作為 HTML 語言的替代品而出現的,但是隨著該語言的不斷髮展和完善,人們越來越發現它所具有的優點:例如標記語言可擴展,嚴格的語法規定,可使用有意義的標記,內容存儲和表現分離等等優勢註定了該語言從誕生之日起就會走向輝煌。 XML 語言在成為 W3C 標準之後進入到了一個快速發展的時期,當然它本身所具有的一系列優點和優勢也註定了各大技術廠商對它的偏愛,Java 作為軟件行業的一種開發技術也迅速作出了反應,出現了多種對 XML 支持的工具.

XML 三種解析方式簡介

大名鼎鼎的 DOM

說它大名鼎鼎可是一點不為過,DOM 是 W3C 處理 XML 的標準 API,它是許多其它與 XML 處理相關的標準的基礎,不僅是 Java,其它諸如 Javascript,PHP,MS .NET 等等語言都實現了該標準, 成為了應用最為廣泛的 XML 處理方式。當然,為了能提供更多更加強大的功能,Java 對於 DOM 直接擴展工具類有很多,比如很多 Java 程序員耳熟能詳的 JDOM,DOM4J 等等, 它們基本上屬於對 DOM 接口功能的擴充,保留了很多 DOM API 的特性,許多原本的 DOM 程序員甚至都沒有任何障礙就熟練掌握了另外兩者的使用,直觀、易於操作的方式使它深受廣大 Java 程序員的喜愛。

綠色環保的 SAX

SAX 的應運而生有它特殊的需要,為什麼說它綠色環保呢,這是因為 SAX 使用了最少的系統資源和最快速的解析方式對 XML 處理提供了支持。 但隨之而來繁瑣的查找方式也給廣大程序員帶來許多困擾,常常令人頭痛不已,同時它對 XPath 查詢功能的支持,令人們對它又愛又恨。

默默無聞的 Digester:XML 的 JavaBean 化

Digester 是 apache 基金組織下的一個開源項目,筆者對它的瞭解源於對 Struts 框架的研究,是否有很多程序員想要一解各大開源框架的設計甚至想要自己寫一個功能強大的框架時會碰到這樣一個難題: 這些形形色色的用 XML 語言標記的框架配置文件,框架底層是用什麼技術來解析呢? DOM 解析耗費時間,SAX 解析又過於繁瑣,況且每次解析系統開銷也會過大, 於是,大家想到需要用與 XML 結構相對應的 JavaBean 來裝載這些信息,由此 Digester 應運而生。它的出現為 XML 轉換為 JavaBean 對象的需求帶來了方便的操作接口,使得更多的類似需求得到了比較完美的解決方法, 不再需要程序員自己實現此類繁瑣的解析程序了。與此同時 SUN 也推出了 XML 和 JavaBean 轉換工具類 JAXB,有興趣的讀者可以自行了解。

三種解析方式比較

DOM

優缺點:實現 W3C 標準,有多種編程語言支持這種解析方式,並且這種方法本身操作上簡單快捷,十分易於初學者掌握。其處理方式是將 XML 整個作為類似樹結構的方式讀入內存中以便操作及解析,因此支持應用程序對 XML 數據的內容和結構進行修改,但是同時由於其需要在處理開始時將整個 XML 文件讀入到內存中去進行分析,因此其在解析大數據量的 XML 文件時會遇到類似於內存洩露以及程序崩潰的風險,請對這點多加註意。

適用範圍:小型 XML 文件解析、需要全解析或者大部分解析 XML、需要修改 XML 樹內容以生成自己的對象模型

SAX

SAX 從根本上解決了 DOM 在解析 XML 文檔時產生的佔用大量資源的問題。其實現是通過類似於流解析的技術,通讀整個 XML 文檔樹,通過事件處理器來響應程序員對於 XML 數據解析的需求。由於其不需要將整個 XML 文檔讀入內存當中,它對系統資源的節省是十分顯而易見的,它在一些需要處理大型 XML 文檔以及性能要求較高的場合有起了十分重要的作用。支持 XPath 查詢的 SAX 使得開發人員更加靈活,處理起 XML 來更加的得心應手。但是同時,其仍然有一些不足之處也困擾廣大的開發人員:首先是它十分複雜的 API 接口令人望而生畏,其次由於其是屬於類似流解析的文件掃描方式,因此不支持應用程序對於 XML 樹內容結構等的修改,可能會有不便之處。

適用範圍:大型 XML 文件解析、只需要部分解析或者只想取得部分 XML 樹內容、有 XPath 查詢需求、有自己生成特定 XML 樹對象模型的需求

Digester/JAXB

優缺點 : 由於其是在上述兩者的基礎上衍生出來的工具類,為的是滿足將 XML 轉換為 JavaBean 的特殊需求,故而沒有什麼特別明顯的優缺點。作為大名鼎鼎的開源框架 Struts 的 XML 解析工具 Digester,為我們帶來了將 XML 轉換為 JavaBean 的可靠方法。

適用範圍 : 有將 XML 文檔直接轉換為 JavaBean 需求。

——此段摘自:Java 處理 XML 的三種主流技術及介紹



簡單來說,比較常用的XML解析主要有DOM解析和SAX解析,DOM解析優點突出可以對DOM文檔樹的內容和結構進行修改,但是需要加載全部xml文件用以構建文檔樹,故速度較慢,內存佔用較高。SAX解析則相反,速度較快但是不支持修改。

Java中經常用dom4j來解析xml文件。dom4j顧名思義是利用DOM解析原理進行解析的。

本文代碼用的是:dom4j-1.6.1.jar,實現創建和讀取一個簡單xml文件的效果。

代碼主要包括:createXML()和readXML()兩個方法。

1.createXML()創建了一個簡單的xml文件(school.xml):

Java.util.Properties和dom4j讀寫.properties和.xml

<code>public static void createXML(String path){
try {
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");// 設置XML文件的編碼格式
File file = new File(path);
//創建DOM文檔樹根節點doc
Document doc = DocumentHelper.createDocument();
//創建第一個節點school1
Element school1 = doc.addElement("加里敦大學");
//給school1添加子節點stu1
Element child1 = school1.addElement("學生");
//給stu1節點增加屬性及子節點
child1.addAttribute("學號","001");
Element name1 = child1.addElement("姓名");
name1.setText("萊納德");
Element high1 = child1.addElement("身高");
high1.setText("165");
//給school1添加子節點child2
Element child2 = school1.addElement("教師");
child2.addAttribute("職工號","001");
Element name2 = child2.addElement("姓名");
name2.setText("謝爾頓");
Element high2 = child2.addElement("身高");
high2.setText("185");

//創建XMLWriter對象,並將doc文檔寫入
XMLWriter writer = new XMLWriter(new FileWriter(file), format);
writer.write(doc);
writer.close();
System.out.println("XML文件創建成功!路徑是:" + path);
} catch (IOException e) {
e.printStackTrace();
}
}/<code>

2.用readXML()方法遍歷xml文檔樹中的節點和屬性

<code>public static void readXML(Element root){
System.out.println(root.getName()+":"+root.getText().trim()
);
List<attribute> attrList = root.attributes();
for(Attribute attr : attrList){
System.out.println(attr.getName()+ ":" + attr.getValue());
}
List<element> eleList = root.elements();
for(Element ele : eleList){
readXML(ele);
}
}/<element>/<attribute>/<code>

完整代碼及運行結果如下:

Java.util.Properties和dom4j讀寫.properties和.xml


分享到:


相關文章: