|
在我們平時(shí)寫程序的時(shí)候,有些參數(shù)是經(jīng)常改變的,而這種改變不是我們預(yù)知的。比如說我們開發(fā)了一個(gè)操作數(shù)據(jù)庫(kù)的模塊,在開發(fā)的時(shí)候我們連接本地的數(shù)據(jù)庫(kù)那么 IP ,數(shù)據(jù)庫(kù)名稱,表名稱,數(shù)據(jù)庫(kù)主機(jī)等信息是我們本地的,要使得這個(gè)操作數(shù)據(jù)的模塊具有通用性,那么以上信息就不能寫死在程序里。通常我們的做法是用配置文件來解決。 各種語言都有自己所支持的配置文件類型。比如 Python ,他支持 .ini 文件。因?yàn)樗麅?nèi)部有一個(gè) ConfigParser 類來支持 .ini 文件的讀寫,根據(jù)該類提供的方法程序員可以自由的來操作 .ini 文件。而在 Java 中, Java 支持的是 .properties 文件的讀寫。 JDK 內(nèi)置的 java.util.Properties 類為我們操作 .properties 文件提供了便利。
一. .properties 文件的形式 ==========================================================
# 以下為服務(wù)器、數(shù)據(jù)庫(kù)信息 dbPort = localhost databaseName = mydb dbUserName = root dbPassword = root # 以下為數(shù)據(jù)庫(kù)表信息 dbTable = mytable # 以下為服務(wù)器信息 ip = 192.168.0.9 ······ 在上面的文件中我們假設(shè)該文件名為: test.properties 文件。其中 # 開始的一行為注釋信息;在等號(hào)“ = ”左邊的我們稱之為 key ;等號(hào)“ = ”右邊的我們稱之為 value 。(其實(shí)就是我們常說的鍵 - 值對(duì)) key 應(yīng)該是我們程序中的變量。而 value 是我們根據(jù)實(shí)際情況配置的。
二. JDK 中的 Properties 類 Properties 類存在于胞 Java.util 中,該類繼承自
4. 5. 有了以上幾個(gè)方法我們就可以對(duì) .properties 文件進(jìn)行操作了! 三.代碼實(shí)例
package configuration;![]() import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.Properties;![]() ![]() /** *//** * 讀取properties文件 * @author Qutr * */ public class Configuration![]() ...{ private Properties propertie; private FileInputStream inputFile; private FileOutputStream outputFile; ![]() /** *//** * 初始化Configuration類 */ public Configuration()![]() ...{ propertie = new Properties(); } ![]() /** *//** * 初始化Configuration類 * @param filePath 要讀取的配置文件的路徑+名稱 */ public Configuration(String filePath)![]() ...{ propertie = new Properties();![]() try ...{ inputFile = new FileInputStream(filePath); propertie.load(inputFile); inputFile.close();![]() } catch (FileNotFoundException ex) ...{ System.out.println("讀取屬性文件--->失?。? 原因:文件路徑錯(cuò)誤或者文件不存在"); ex.printStackTrace();![]() } catch (IOException ex) ...{ System.out.println("裝載文件--->失敗!"); ex.printStackTrace(); } }//end ReadConfigInfo(...) ![]() /** *//** * 重載函數(shù),得到key的值 * @param key 取得其值的鍵 * @return key的值 */ public String getValue(String key)![]() ...{![]() if(propertie.containsKey(key))...{ String value = propertie.getProperty(key);//得到某一屬性的值 return value; } else return ""; }//end getValue(...) ![]() /** *//** * 重載函數(shù),得到key的值 * @param fileName properties文件的路徑+文件名 * @param key 取得其值的鍵 * @return key的值 */ public String getValue(String fileName, String key)![]() ...{![]() try ...{ String value = ""; inputFile = new FileInputStream(fileName); propertie.load(inputFile); inputFile.close();![]() if(propertie.containsKey(key))...{ value = propertie.getProperty(key); return value; }else return value;![]() } catch (FileNotFoundException e) ...{ e.printStackTrace(); return "";![]() } catch (IOException e) ...{ e.printStackTrace(); return "";![]() } catch (Exception ex) ...{ ex.printStackTrace(); return ""; } }//end getValue(...) ![]() /** *//** * 清除properties文件中所有的key和其值 */ public void clear()![]() ...{ propertie.clear(); }//end clear(); ![]() /** *//** * 改變或添加一個(gè)key的值,當(dāng)key存在于properties文件中時(shí)該key的值被value所代替, * 當(dāng)key不存在時(shí),該key的值是value * @param key 要存入的鍵 * @param value 要存入的值 */ public void setValue(String key, String value)![]() ...{ propertie.setProperty(key, value); }//end setValue(...) ![]() /** *//** * 將更改后的文件數(shù)據(jù)存入指定的文件中,該文件可以事先不存在。 * @param fileName 文件路徑+文件名稱 * @param description 對(duì)該文件的描述 */ public void saveFile(String fileName, String description)![]() ...{![]() try ...{ outputFile = new FileOutputStream(fileName); propertie.store(outputFile, description); outputFile.close();![]() } catch (FileNotFoundException e) ...{ e.printStackTrace();![]() } catch (IOException ioe)...{ ioe.printStackTrace(); } }//end saveFile(...) public static void main(String[] args)![]() ...{ Configuration rc = new Configuration(".\config\test.properties");//相對(duì)路徑 String ip = rc.getValue("ipp");//以下讀取properties文件的值 String host = rc.getValue("host"); String tab = rc.getValue("tab"); System.out.println("ip = " + ip + "ip-test leng = " + "ip-test".length());//以下輸出properties讀出的值 System.out.println("ip's length = " + ip.length()); System.out.println("host = " + host); System.out.println("tab = " + tab);![]() Configuration cf = new Configuration(); String ipp = cf.getValue(".\config\test.properties", "ip"); System.out.println("ipp = " + ipp); // cf.clear(); cf.setValue("min", "999"); cf.setValue("max", "1000"); cf.saveFile(".\config\save.perperties", "test"); // Configuration saveCf = new Configuration(); // saveCf.setValue("min", "10"); // saveCf.setValue("max", "1000"); // saveCf.saveFile(".\config\save.perperties"); }//end main() }//end class ReadConfigInfo![]()
四.小結(jié) 通過上面的例子不難看出,在Java中操作配置文件是非常簡(jiǎn)單的。在一個(gè)需要用到大量配置信息的模塊或系統(tǒng)里,我們有必要封裝一個(gè)專門的類來共使用。通過最后的main函數(shù)調(diào)用,相信大家可以看出該類的用法。不足指出希望大家多多指點(diǎn)。
Java properties文件的操作
一、properties文件 IcisReport.properties ------------------------------------------------------
二、操作properties文件的java方法
下面是一個(gè)操作properties文件的方法 ------------------------------------------------------ Properties prop = new Properties(); if (icisReportServerIP.trim().equals("")) { icisReportURL = "http://" + icisReportServerIP.trim() + ":" + icisReportServerPort.trim()+icisReportContextPath.trim(); ------------------------------------------------------
總 結(jié):java的properties文件需要放到classpath下面,這樣程序才能讀取到,有關(guān)classpath實(shí)際上就是java類或者庫(kù)的存放 路徑,在java工程中,properties放到class文件一塊。在web應(yīng)用中,最簡(jiǎn)單的方法是放到web應(yīng)用的WEB-INF\classes 目錄下即可,也可以放在其他文件夾下面,這時(shí)候需要在設(shè)置classpath環(huán)境變量的時(shí)候,將這個(gè)文件夾路徑加到classpath變量中,這樣也也可 以讀取到。在此,你需要對(duì)classpath有個(gè)深刻理解,classpath絕非系統(tǒng)中刻意設(shè)定的那個(gè)系統(tǒng)環(huán)境變量,WEB-INF\classes其 實(shí)也是,java工程的class文件目錄也是。 |
|
|