欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Java程序中的配置文件的存放和讀取
大家可能經(jīng)常會(huì )遇到在Java程序中存取程序配置文件的需求,比如,為了能夠和不同的數據庫連接,我們經(jīng)常把數據庫連接的信息存放到屬性文件中,這些信息一般包括數據庫驅動(dòng)程序類(lèi)名、數據庫連接的URL,數據庫的用戶(hù)名和口令等等。為了便于程序的安裝或部署,我們經(jīng)常會(huì )把這些的配置文件存放到程序安裝的根目錄中。由于Java程序用包來(lái)分組類(lèi),有時(shí)候將這些配置文件放入到讀取它們的類(lèi)所在的包目錄中會(huì )更好一些。比如,在下面的圖示中,將數據庫配置文件 database.properties放到數據庫讀取類(lèi)所在的包目錄就是一種比較清晰的存儲方案:

                        /-----------其它包目錄
                              |
                              |
                              -------edu.ec.database
                                                 |
                                                 |---------------ConnectionPool(數據庫連接池類(lèi))
                                                 |
                                                 |---------------Dao(數據庫訪(fǎng)問(wèn)對象類(lèi))
                                                 |
                                                 |---------------DaoFactory(Dao的工廠(chǎng)類(lèi))
                                                 |
                                                 |---------------database.properties(數據庫配置屬性文件)
                                                 |
                                                 |---------------RecordSet(記錄集類(lèi))
   
在這種存儲方案中,所有的與數據庫相關(guān)的類(lèi)和配置文件都在同一個(gè)包目錄中;在開(kāi)發(fā)過(guò)程中,配置文件和源文件也按采用這種方式進(jìn)行組織,這樣會(huì )使得程序的數據庫訪(fǎng)問(wèn)維護變得相當清晰明了。

大部分開(kāi)發(fā)工具在編譯打包這樣的源文件組織時(shí),會(huì )自動(dòng)將相關(guān)配置文件和類(lèi)文件放到生成的目標文件夾中或JAR文件中。一般情況下,我們在發(fā)布自己的 Java程序時(shí),都是以JAR或WAR形式將程序打包發(fā)布,而對應的配置文件也會(huì )按照上述的目錄格式被放到了JAR或WAR文件中,這樣,就實(shí)現了配置文件和程序文件打包在一起發(fā)布的目的。

現在的問(wèn)題是,我們如何讀取位于程序安裝文件中的配置文件的信息?比如,在上面的圖中, ConnectionPool是一個(gè)數據庫連接池類(lèi),它需要在系統啟動(dòng)時(shí)自動(dòng)讀取存儲在database.properties中的數據庫連接和配置信息,以便設置相關(guān)的數據庫連接。這樣,我們 就需要在程序中測定目前程序安裝或部署的位置,以便讀取對應的屬性文件。

       在很多其他語(yǔ)言編寫(xiě)的程序中,我們可以利用一些系統提供的API或一些全局對象獲取目前應用程序運行所在的目錄。比如VB,我們可以使用Application對象測定當前程序的安裝位置,在Java程序中如何完成類(lèi)似的任務(wù)呢?

Java程序并沒(méi)有類(lèi)似于VB那種全局對象,但如果我們觀(guān)察位于上述目錄結構中的database.properties文件,應該發(fā)現其處于應用程序的CLASSPATH中,這樣,我們就可以使用Java中的類(lèi)裝載器中的相關(guān)的方法,讀出這些配置文件的信息,該類(lèi)名為ClassLoader。比如,在上例中,我們可以先得到ConnectinPool的類(lèi)裝載器,然后測定ConnectionPool類(lèi)所在的包路徑,然后利用 ConnectionPool所在的包目錄讀出database.properties文件的信息,對應的偽代碼如下:

            ClassLoader loader=ConnectionPool.class.getClassLoader();
            得到ConnectionPool所在的包名;
            將包名轉換為對應的目錄名,存入一個(gè)名為path的字符串變量中;
           調用loader的getResourceAsStream(path+"database.properties"),得到輸入流
          
          下面是一個(gè)可實(shí)際運行的樣例代碼片段,它可自動(dòng)測定傳入的類(lèi)所在的包目錄,返回傳入的屬性文件所代表的輸入流。它還有一個(gè)附加的功能:如果屬性文件直接放到了當前類(lèi)所在的根目錄(比如位于JAR文件的根目錄或WAR文件的WEB-INF/classes目錄中)、系統的用戶(hù)目錄系統、系統其他的類(lèi)路徑中時(shí),它也可以找到;當然,如果還是找不到,它將返回null。具體的代碼如下:


        public class PropHelper{
                      /**
                       *guessPropFile:
                       *@param cls:和要尋找的屬性文件處于相同的包中的任意的類(lèi)
                       *@param propFile:要尋找的屬性文件名
                       */
                   public   static java.io.InputStream guessPropFile(Class cls,String propFile){
                                try{
                                      //得到類(lèi)的類(lèi)裝載器
                                      ClassLoader loader=cls.getClassLoader();
                                     
                                      //先從當前類(lèi)所處路徑的根目錄中尋找屬性文件
                                      java.io.InputStream in=loader.getResourceAsStream(propFile);
                                      if(in!=null) return in;
                                     
                                      //沒(méi)有找到,就從該類(lèi)所處的包目錄中查找屬性文件
                                     Package pack=cls.getPackage();
                                     if(pack!=null){
                                              String packName=pack.getName();
                                              String path="";
                                              if(packName.indexOf(".") < 0 )
                                                 path=packName+"/";
                                              else{
                                                       int start=0,end=0;
                                                       end=packName.indexOf(".");
                                                       while(end!=-1){
                                                             path=path+packName.substring(start,end)+"/";
                                                             start=end+1;
                                                            end=packName.indexOf(".",start);
                                                        }
                                                       path=path+packName.substring(start)+"/";
                                              }
                                              in=loader.getResourceAsStream(path+propFile);
                                              if(in!=null) return in;
                                   }
                                  
                                  //如果沒(méi)有找到,再從當前系統的用戶(hù)目錄中進(jìn)行查找
                                  java.io.File f=null;
                                  String curDir=System.getProperty("user.dir");
                                  f=new java.io.File(curDir,propFile);
                                  if(f.exists()) return new java.io.FileInputStream(f);
                                 
                                  //如果還是沒(méi)有找到,則從系統所有的類(lèi)路徑中查找
                                  String classpath=System.getProperty("java.class.path");
                                  String[] cps=classpath.split(System.getProperty("path.separator"));
                                 
                                  for(int i=0;i < cps.length; i++){
                                           f=new java.io.File(cps[i],propFile);
                                           if(f.exists()) break;
                                           f=null;
                                   }
                                  if(f!=null) return new java.io.FileInputStream(f);
                                  return null;
                            }catch(Exception e){throw new RuntimeException(e);}
                  
                     }
        }
        
使用舉例:利用上述的方法,可在ConnectionPool中自動(dòng)查找和ConnectionPool處于同一個(gè)包目錄中的database.properties的輸入流,并利用該輸入流讀入對應的屬性值的代碼如下:
       public class ConnectionPool{
            //靜態(tài)初始化器,將在ConnectionPools加載時(shí)自動(dòng)執行
           static{
               java.util.Properties dbProp=new java.util.Properties();
               java.io.InputStream in=PropHelper.guessPropFile(edu.ec.database.ConnectionPool.class,"database.properties");
               if(in!=null) dbProp.load(in);
               //利用dbProp,為相應的數據源對象設置相關(guān)的屬性,比如C3P0........
            }
     }
--------------------------------------------------------------------------------------------------------
程序打包成Jar發(fā)布后,應該將配置文件放在jar的當前同級目錄,訪(fǎng)問(wèn)調用直接訪(fǎng)問(wèn),如
java.util.Properties pro = new java.util.Properties();
InputStream inStream = new java.io.FileInputStream("database.properties");pro.load(inStream);
如果是打包成WAR發(fā)布,則放在適合LZ的方法
----------------------------------------------------------
2007-07-26

Java程序中的配置文件的存放和讀取

關(guān)鍵字: 數據庫 屬性文件 類(lèi)路徑
大家可能經(jīng)常會(huì )遇到在Java程序中存取程序配置文件的需求,比如,為了能夠和不同的數據庫連接,我們經(jīng)常把數據庫連接的信息存放到屬性文件中,這些信息一般包括數據庫驅動(dòng)程序類(lèi)名、數據庫連接的URL,數據庫的用戶(hù)名和口令等等。為了便于程序的安裝或部署,我們經(jīng)常會(huì )把這些的配置文件存放到程序安裝的根目錄中。由于Java程序用包來(lái)分組類(lèi),有時(shí)候將這些配置文件放入到讀取它們的類(lèi)所在的包目錄中會(huì )更好一些。比如,在下面的圖示中,將數據庫配置文件 database.properties放到數據庫讀取類(lèi)所在的包目錄就是一種比較清晰的存儲方案:

                        /-----------其它包目錄
                              |
                              |
                              -------edu.ec.database
                                                 |
                                                 |---------------ConnectionPool(數據庫連接池類(lèi))
                                                 |
                                                 |---------------Dao(數據庫訪(fǎng)問(wèn)對象類(lèi))
                                                 |
                                                 |---------------DaoFactory(Dao的工廠(chǎng)類(lèi))
                                                 |
                                                 |---------------database.properties(數據庫配置屬性文件)
                                                 |
                                                 |---------------RecordSet(記錄集類(lèi))
   
在這種存儲方案中,所有的與數據庫相關(guān)的類(lèi)和配置文件都在同一個(gè)包目錄中;在開(kāi)發(fā)過(guò)程中,配置文件和源文件也按采用這種方式進(jìn)行組織,這樣會(huì )使得程序的數據庫訪(fǎng)問(wèn)維護變得相當清晰明了。

大部分開(kāi)發(fā)工具在編譯打包這樣的源文件組織時(shí),會(huì )自動(dòng)將相關(guān)配置文件和類(lèi)文件放到生成的目標文件夾中或JAR文件中。一般情況下,我們在發(fā)布自己的 Java程序時(shí),都是以JAR或WAR形式將程序打包發(fā)布,而對應的配置文件也會(huì )按照上述的目錄格式被放到了JAR或WAR文件中,這樣,就實(shí)現了配置文件和程序文件打包在一起發(fā)布的目的。

現在的問(wèn)題是,我們如何讀取位于程序安裝文件中的配置文件的信息?比如,在上面的圖中, ConnectionPool是一個(gè)數據庫連接池類(lèi),它需要在系統啟動(dòng)時(shí)自動(dòng)讀取存儲在database.properties中的數據庫連接和配置信息,以便設置相關(guān)的數據庫連接。這樣,我們 就需要在程序中測定目前程序安裝或部署的位置,以便讀取對應的屬性文件。

       在很多其他語(yǔ)言編寫(xiě)的程序中,我們可以利用一些系統提供的API或一些全局對象獲取目前應用程序運行所在的目錄。比如VB,我們可以使用Application對象測定當前程序的安裝位置,在Java程序中如何完成類(lèi)似的任務(wù)呢?

Java程序并沒(méi)有類(lèi)似于VB那種全局對象,但如果我們觀(guān)察位于上述目錄結構中的database.properties文件,應該發(fā)現其處于應用程序的CLASSPATH中,這樣,我們就可以使用Java中的類(lèi)裝載器中的相關(guān)的方法,讀出這些配置文件的信息,該類(lèi)名為ClassLoader。比如,在上例中,我們可以先得到ConnectinPool的類(lèi)裝載器,然后測定ConnectionPool類(lèi)所在的包路徑,然后利用 ConnectionPool所在的包目錄讀出database.properties文件的信息,對應的偽代碼如下:

            ClassLoader loader=ConnectionPool.class.getClassLoader();
            得到ConnectionPool所在的包名;
            將包名轉換為對應的目錄名,存入一個(gè)名為path的字符串變量中;
           調用loader的getResourceAsStream(path+"database.properties"),得到輸入流
          
          下面是一個(gè)可實(shí)際運行的樣例代碼片段,它可自動(dòng)測定傳入的類(lèi)所在的包目錄,返回傳入的屬性文件所代表的輸入流。它還有一個(gè)附加的功能:如果屬性文件直接放到了當前類(lèi)所在的根目錄(比如位于JAR文件的根目錄或WAR文件的WEB-INF/classes目錄中)、系統的用戶(hù)目錄系統、系統其他的類(lèi)路徑中時(shí),它也可以找到;當然,如果還是找不到,它將返回null。具體的代碼如下:


        public class PropHelper{
                      /**
                       *guessPropFile:
                       *@param cls:和要尋找的屬性文件處于相同的包中的任意的類(lèi)
                       *@param propFile:要尋找的屬性文件名
                       */
                   public   static java.io.InputStream guessPropFile(Class cls,String propFile){
                                try{
                                      //得到類(lèi)的類(lèi)裝載器
                                      ClassLoader loader=cls.getClassLoader();
                                     
                                      //先從當前類(lèi)所處路徑的根目錄中尋找屬性文件
                                      java.io.InputStream in=loader.getResourceAsStream(propFile);
                                      if(in!=null) return in;
                                     
                                      //沒(méi)有找到,就從該類(lèi)所處的包目錄中查找屬性文件
                                     Package pack=cls.getPackage();
                                     if(pack!=null){
                                              String packName=pack.getName();
                                              String path="";
                                              if(packName.indexOf(".") < 0 )
                                                 path=packName+"/";
                                              else{
                                                       int start=0,end=0;
                                                       end=packName.indexOf(".");
                                                       while(end!=-1){
                                                             path=path+packName.substring(start,end)+"/";
                                                             start=end+1;
                                                            end=packName.indexOf(".",start);
                                                        }
                                                       path=path+packName.substring(start)+"/";
                                              }
                                              in=loader.getResourceAsStream(path+propFile);
                                              if(in!=null) return in;
                                   }
                                  
                                  //如果沒(méi)有找到,再從當前系統的用戶(hù)目錄中進(jìn)行查找
                                  java.io.File f=null;
                                  String curDir=System.getProperty("user.dir");
                                  f=new java.io.File(curDir,propFile);
                                  if(f.exists()) return new java.io.FileInputStream(f);
                                 
                                  //如果還是沒(méi)有找到,則從系統所有的類(lèi)路徑中查找
                                  String classpath=System.getProperty("java.class.path");
                                  String[] cps=classpath.split(System.getProperty("path.separator"));
                                 
                                  for(int i=0;i < cps.length; i++){
                                           f=new java.io.File(cps[i],propFile);
                                           if(f.exists()) break;
                                           f=null;
                                   }
                                  if(f!=null) return new java.io.FileInputStream(f);
                                  return null;
                            }catch(Exception e){throw new RuntimeException(e);}
                  
                     }
        }
        
使用舉例:利用上述的方法,可在ConnectionPool中自動(dòng)查找和ConnectionPool處于同一個(gè)包目錄中的database.properties的輸入流,并利用該輸入流讀入對應的屬性值的代碼如下:
       public class ConnectionPool{
            //靜態(tài)初始化器,將在ConnectionPools加載時(shí)自動(dòng)執行
           static{
               java.util.Properties dbProp=new java.util.Properties();
               java.io.InputStream in=PropHelper.guessPropFile(edu.ec.database.ConnectionPool.class,"database.properties");
               if(in!=null) dbProp.load(in);
               //利用dbProp,為相應的數據源對象設置相關(guān)的屬性,比如C3P0........
            }
     }
評論
tvjody 2007-08-20   回復
deadcode 寫(xiě)道
這個(gè)道路是不是有些曲折?
要是程序被打包了,要改個(gè)配置還要重新打包?

配置文件多的話(huà)還是集中起來(lái)管理比較直觀(guān),而且很多可以在系統啟動(dòng)時(shí)先加載,一般也就一次.
程序打包成Jar發(fā)布后,應該將配置文件放在jar的當前同級目錄,訪(fǎng)問(wèn)調用直接訪(fǎng)問(wèn),如
java.util.Properties pro = new java.util.Properties();
InputStream inStream = new java.io.FileInputStream("database.properties");pro.load(inStream);
如果是打包成WAR發(fā)布,則放在適合LZ的方法
deadcode 2007-08-14   回復
這個(gè)道路是不是有些曲折?
要是程序被打包了,要改個(gè)配置還要重新打包?

配置文件多的話(huà)還是集中起來(lái)管理比較直觀(guān),而且很多可以在系統啟動(dòng)時(shí)先加載,一般也就一次.
hdwangyi 2007-07-26   回復
    現在,guessPropFile可以自動(dòng)在如下位置中尋找屬性文件:
   

       
  1. 在未打包的Java程序的類(lèi)文件所在的根目錄中尋找屬性文件
  2.    
  3. 在打包的JAR程序的根目錄中尋找屬性文件
  4.    
  5. 在未打包的Java類(lèi)文件所在的根目錄中對應傳入參數類(lèi)所在的包目錄中尋找屬性文件
  6.    
  7. 在打包的JAR文件中對應傳入參數類(lèi)所在的包目錄中尋找屬性文件
  8.    
  9. 在未打包及打包的WAR文件夾中的WEB-INF/classes目錄中尋找屬性文件
  10.    
  11. 在未打包及打包的WAR文件中的WEB-INF/classes目錄中對應傳入參數類(lèi)所在的包目錄中尋找屬性文件
  12.    
  13. 在操作系統中的當前登錄用戶(hù)的主目錄中尋找屬性文件
  14.    
  15. 在系統設定的環(huán)境變量CLASSPATH所指向的各個(gè)目錄中尋找屬性文件
  16.    

 
    其實(shí),guessPropFile方法還可做的更加智能一些,比如在WAR文件的WEB-INF文件中尋找屬性文件。如果要完成這個(gè)任務(wù),ClassLoader是關(guān)鍵類(lèi),利用它的getResource方法,就可以獲得相應程序中的資源的位置,我們可以在它的基礎上稍加修改就可獲得當前Java程序的運行位置信息,其偽代碼如下:
  獲得Class參數的所在的類(lèi)名
  取得該類(lèi)所在的包名
  將包名轉換為路徑
  利用getResource得到當前的類(lèi)文件所在URL
  利用URL解析出當前Java程序所在的路徑
具體代碼如下:
Java代碼
  1. public class PropHelper{   
  2.  //其他方法的定義   
  3.  //.............   
  4.   
  5.  /**  
  6.   *getAppPath需要一個(gè)當前程序使用的Java類(lèi)的class屬性參數,它可以返回打包過(guò)的  
  7.   *Java可執行文件(jar,war)所處的系統目錄名或非打包Java程序所處的目錄  
  8.   *@param cls為Class類(lèi)型  
  9.   *@return 返回值為該類(lèi)所在的Java程序運行的目錄  
  10.   */  
  11.  public static String getAppPath(Class cls){   
  12.      ClassLoader loader=cls.getClassLoader();   
  13.      String clsName=cls.getName()+".class";   
  14.      Package pack=cls.getPackage();   
  15.      String path="";   
  16.      if(pack!=null){   
  17.          String packName=pack.getName();   
  18.          clsName=clsName.substring(packName.length()+1);   
  19.          if(packName.indexOf(".")<0) path=packName+"/";   
  20.          else{   
  21.              int start=0,end=0;   
  22.              end=packName.indexOf(".");   
  23.              while(end!=-1){   
  24.                  path=path+packName.substring(start,end)+"/";   
  25.                  start=end+1;   
  26.                  end=packName.indexOf(".",start);   
  27.              }   
  28.              path=path+packName.substring(start)+"/";   
  29.          }   
  30.      }   
  31.      java.net.URL url =loader.getResource(path+clsName);   
  32.      String realPath=url.getPath();   
  33.      int pos=realPath.indexOf("file:");   
  34.      if(pos>-1) realPath=realPath.substring(pos+5);   
  35.      pos=realPath.indexOf(path+clsName);   
  36.      realPath=realPath.substring(0,pos-1);   
  37.      if(realPath.endsWith("!"))   
  38.          realPath=realPath.substring(0,realPath.lastIndexOf("/"));   
  39.      return realPath;   
  40.  }//getAppPath定義結束   
  41.   
  42. /PropHelper類(lèi)定義結束  

在getAppPath方法的幫助下,我們可以測定當前程序運行的路徑是不是包含WEB-INF/classes路徑信息,如果是,則當前程序就可能是運行在Web環(huán)境中,這樣,就可以對guessPropFile中的代碼進(jìn)行增加,加入在WEB-INF文件夾尋找屬性文件的方法。
 
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
appfuse配置文件解讀
ini配置文件操作方法
Windows 服務(wù)程序 配置文件路徑問(wèn)題
Java運行時(shí)命令行的寫(xiě)法
利用ant,hibernate的schemaexport自動(dòng)生成數據庫 | 中國JAVA技...
gwt.xml
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久