hello world

          隨筆 - 2, 文章 - 63, 評論 - 0, 引用 - 0
          數(shù)據(jù)加載中……

          Java Properties 類讀取配置文件信息

          ?Java Properties 類讀取配置文件信息?? 文章指數(shù):0??CSDN Blog推出文章指數(shù)概念,文章指數(shù)是對Blog文章綜合評分后推算出的,綜合評分項分別是該文章的點擊量,回復次數(shù),被網(wǎng)摘收錄數(shù)量,文章長度和文章類型;滿分100,每月更新一次。

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

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

          一..properties文件的形式==========================================================

          ?

          #以下為服務器、數(shù)據(jù)庫信息

          dbPort = localhost

          databaseName = mydb

          dbUserName = root

          dbPassword = root

          #以下為數(shù)據(jù)庫表信息

          dbTable = mytable

          #以下為服務器信息

          ip = 192.168.0.9

          ······

          在上面的文件中我們假設該文件名為:test.properties文件。其中#開始的一行為注釋信息;在等號“=”左邊的我們稱之為key;等號“=”右邊的我們稱之為value。(其實就是我們常說的鍵-值對)key應該是我們程序中的變量。而value是我們根據(jù)實際情況配置的。

          二.JDK中的PropertiesProperties類存在于胞Java.util中,該類繼承自Hashtable,它提供了幾個主要的方法:1.getProperty(String?key),?用指定的鍵在此屬性列表中搜索屬性。也就是通過參數(shù)key,得到key所對應的value

          ?

          ?

          2.load(InputStream?inStream),從輸入流中讀取屬性列表(鍵和元素對)。通過對指定的文件(比如說上面的test.properties文件)進行裝載來獲取該文件中的所有鍵-值對。以供getProperty(String?key)來搜索。3.setProperty(String?key, String?value),調(diào)用Hashtable的方法put。他通過調(diào)用基類的put方法來設置-值對。

          ?

          4.store(OutputStream?out, String?comments),?以適合使用load方法加載到Properties表中的格式,將此Properties表中的屬性列表(鍵和元素對)寫入輸出流。與load方法相反,該方法將鍵-值對寫入到指定的文件中去。

          5.clear(),清除所有裝載的-值對。該方法在基類中提供。

          有了以上幾個方法我們就可以對.properties文件進行操作了!

          三.代碼實例

          ?
          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(
          "讀取屬性文件--->失?。??原因:文件路徑錯誤或者文件不存在");
          ????????????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();
          ????
          ????
          /**
          ?????*?改變或添加一個key的值,當key存在于properties文件中時該key的值被value所代替,
          ?????*?當key不存在時,該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?對該文件的描述
          ?????
          */

          ????
          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");//相對路徑
          ????????
          ????????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中操作配置文件是非常簡單的。在一個需要用到大量配置信息的模塊或系統(tǒng)里,我們有必要封裝一個專門的類來共使用。通過最后的main函數(shù)調(diào)用,相信大家可以看出該類的用法。不足指出希望大家多多指點。

          ?

          ?Java properties文件的操作?




          ?????? java中的properties文件是一種配置文件,主要用于表達配置信息,文件類型為*.properties,格式為文本文件,文件的內(nèi)容是格式是 "鍵=值"的格式,在properties文件中,可以用"#"來作注釋,properties文件在Java編程中用到的地方很多,操作很方便。下面是 一個操作java properties文件的例子,給出了操作方法和properties文件。從中可以看到如何讀取properties文件,并應用讀取出來的值,是學 習操作properties文件的好例子。

          一、properties文件

          IcisReport.properties
          ------------------------------------------------------
          ###################################################
          #?? 工商報表應用IcisReport的配置文件?????????????? #
          #?? 作者:雷智民?????????????????????????????????? #
          #?? 日期:2006年11月21日?????????????????????????? #
          ###################################################
          #
          #?? 說明:業(yè)務系統(tǒng)TopIcis和報表系統(tǒng)IcisReport是分離的
          #?? 可分開部署到不同的服務器上,也可以部署到同一個服務
          #?? 器上;IcisReprot作為獨立的web應用程序可以使用任何
          #?? 的Servlet容器或者J2EE服務器部署并單獨運行,也可以
          #?? 通過業(yè)務系統(tǒng)的接口調(diào)用作為業(yè)務系統(tǒng)的一個庫來應用.
          #
          #?? IcisReport的ip
          IcisReport.server.ip=192.168.3.143
          #?? IcisReport的端口
          IcisReport.server.port=8080
          #?? IcisReport的上下文路徑
          IcisReport.contextPath=/IcisReport

          ------------------------------------------------------

          ?

          二、操作properties文件的java方法

          ?

          下面是一個操作properties文件的方法

          ------------------------------------------------------
          ??? /**
          ???? * @return 獲取IcisReport報表應用的URL
          ???? */
          ??? private String getIcisReportURL() {
          ??????? String icisReportURL = "";????????????? //IcisReport報表應用的URL
          ??????? String icisReportServerIP = "";???????? //IcisReport服務器的IP
          ??????? String icisReportServerPort = "";?????? //IcisReport服務器的服務端口
          ??????? String icisReportContextPath="";??????? //IcisReport應用的ContextPath

          ??????? Properties prop = new Properties();
          ??????? InputStream in;
          ??????? try {
          ??????????? in = getClass().getResourceAsStream("/IcisReport.properties");
          ??????????? prop.load(in);
          ??????????? Set keyValue = prop.keySet();
          ??????????? for (Iterator it = keyValue.iterator(); it.hasNext();) {
          ??????????????? String key = (String) it.next();
          ??????????????? if (key.equals("IcisReport.server.ip")) {
          ??????????????????? icisReportServerIP = (String) prop.get(key);
          ??????????????? } else if (key.equals("IcisReport.server.port")) {
          ??????????????????? icisReportServerPort = (String) prop.get(key);
          ??????????????? } else if (key.equals("IcisReport.contextPath")){
          ??????????????????? icisReportContextPath=(String) prop.get(key);
          ??????????????? }
          ??????????? }
          ??????? } catch (Exception e) {
          ??????????? log.error("IO讀取出錯,找不到IcisReport.properties!");
          ??????? }

          ??????? if (icisReportServerIP.trim().equals("")) {
          ??????????? log.error("請檢查配置文件IcisReport.properties中的IcisReport.server.ip項的值是否正確!");
          ??????? }
          ??????? if (icisReportServerPort.trim().equals("")) {
          ??????????? log.error("請檢查配置文件IcisReport.properties中的IcisReport.server.port項的值是否正確!");
          ??????? }
          ??????? if (icisReportServerPort.trim().equals("")) {
          ??????????? log.error("請檢查配置文件IcisReport.properties中的IcisReport.server.port項的值是否正確!");
          ??????? }

          ??????? icisReportURL = "http://" + icisReportServerIP.trim() + ":" + icisReportServerPort.trim()+icisReportContextPath.trim();
          ??????? log.info("獲取的icisReportURL=" + icisReportURL);
          ??????? return icisReportURL;
          ??? }

          ------------------------------------------------------

          ?

          總 結(jié):java的properties文件需要放到classpath下面,這樣程序才能讀取到,有關classpath實際上就是java類或者庫的存放 路徑,在java工程中,properties放到class文件一塊。在web應用中,最簡單的方法是放到web應用的WEB-INF\classes 目錄下即可,也可以放在其他文件夾下面,這時候需要在設置classpath環(huán)境變量的時候,將這個文件夾路徑加到classpath變量中,這樣也也可 以讀取到。在此,你需要對classpath有個深刻理解,classpath絕非系統(tǒng)中刻意設定的那個系統(tǒng)環(huán)境變量,WEB-INF\classes其 實也是,java工程的class文件目錄也是。


          Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=2104561

          posted on 2008-03-28 21:33 聽風 閱讀(305) 評論(0)  編輯  收藏 所屬分類: JAVA

          主站蜘蛛池模板: 济源市| 石阡县| 虞城县| 五大连池市| 芜湖市| 江永县| 涞源县| 平利县| 黔南| 宣城市| 德保县| 江永县| 双流县| 镇巴县| 板桥市| 油尖旺区| 福清市| 农安县| 右玉县| 黑龙江省| 庆云县| 许昌县| 怀化市| 无为县| 忻州市| 和田县| 东平县| 观塘区| 湄潭县| 浦东新区| 延川县| 凌海市| 阿坝县| 维西| 长葛市| 台南市| 嘉荫县| 宁海县| 商水县| 广饶县| 孟州市|