天天看點

Java中Properties配置檔案讀取

以下實踐的是Properties配置檔案的基本操作方法。像spring使用xml做依賴注入時,這個配置檔案起到非常實用的作用。

參考wiki百科的格式簡介:https://zh.wikipedia.org/wiki/.properties,說明如下:

提供的示例如下:

接下來在eclipse測試可行性。使用最簡單的代碼:

正常輸出,沒任何報錯,結果如下:

Java中Properties配置檔案讀取

是以,參照wiki百科的寫法是完全相容的。但是有一點需要注意的:為了避免讀取簡單易懂,最好不要換行;和中文會轉換成Unicode,當要寫中文時,建議用英文或者拼音代替。 

提示:很多專業的寫法會分子產品寫,比如Test.ProjectName=Test;這樣也是完全相容的。

注意:非必要的時候不要使用絕對路徑,除非非常确定配置檔案的位置。

讀取的重點在于路徑,路徑之後就是擷取檔案流。參考此處進行檔案路徑的擷取:javascript:void(0),實質上除了路徑擷取外其它方法有提供流的擷取。

application:

1、存放:在jar包中其實任何位置都可以放,因為最終都會按照開發工程的目錄結構複制到jar包中,隻要擷取的方式對就可以了。比如放在src外面,src裡面的特定包中,METE-INF檔案夾内部等都可以。但是不要放在項目的根目錄,因為預設打jar包是不會複制進去的。

存放位置參考:

Java中Properties配置檔案讀取

最終預設打application包時的目錄如下:

Java中Properties配置檔案讀取

但是如果要把test3.properties檔案打包進jar包時,可以手動Export導出jar包,包含進去:

Java中Properties配置檔案讀取

最終得到如下jar包目錄:

Java中Properties配置檔案讀取

但是非常不建議這麼做,主要有如下幾點問題存在:

①如果使用File對象(javascript:void(0)#autoid-0-1-0第二點)讀取檔案時,指向的目錄是工作目錄;如果是eclipse運作時,指向的是eclipse的工作目錄;而用jar包運作時,指向的就是jar包所在的目錄;那麼也就是說讀取的不是jar包内的檔案,而是外部的檔案;是以用File對象去讀取的方法在jar包上不可取。

②如果使用Class.class.getResource這類方法(javascript:void(0)#autoid-0-2-0第三點)擷取的路徑,在eclipse上擷取是編譯後class目錄,而這個目錄預設隻會複制src/appClientModule目錄下的檔案,在項目根目錄下的檔案是不會複制過去的,是以在eclipse上無法擷取到;但是通過後期打包加入test3.properties時,在jar包上本身和class同一級目錄,是以此時可以正常讀取。這樣一來也就是和調試時都不能同步,是以這裡不建議放在根目錄。

2、讀取:參考:javascript:void(0)

以下為用File對象和類方法擷取以上目錄結構檔案的方法:

①File對象(不建議使用):

參考:javascript:void(0)#autoid-0-1-0(第二中方法)

java.util.Properties類的load方法傳入的參數為InputStream,是以隻要根據File對象建構出來即可,代碼如下:

②類方法擷取(推薦使用):

類方法擷取有很多種,參考:javascript:void(0)#autoid-0-2-0(第三種方法)

但是,用類方法擷取test3.properties檔案就無法在elipse中擷取。是以下面代碼将省略,代碼如下:

注意:上面開頭的斜杠寫法,以及包的路徑寫法。

經過測試上面路徑在jar上正常運作:

Java中Properties配置檔案讀取

下面開始測試各個類庫對properties檔案的讀取:

注意:由于File對象的局限性,是以不作為測試。

① 使用java.util.Properties類的load(InputStream in)方法加載properties檔案:

eclipse輸出結果:

Java中Properties配置檔案讀取

jar輸出結果:

Java中Properties配置檔案讀取

測試一切正常。

②使用java.util.ResourceBundle類的getBundle()方法:

注意:這個getBundle()方法的參數隻能寫成包路徑+properties檔案名,也就說不用帶檔案的字尾。

Java中Properties配置檔案讀取
Java中Properties配置檔案讀取

③使用java.util.PropertyResourceBundle類的構造函數:

Java中Properties配置檔案讀取
Java中Properties配置檔案讀取

測試工程:https://github.com/easonjim/5_java_example/tree/master/propertiestest/application

Web:

1、存放:

基本都是任意位置,但是不能放在項目根目錄,如下圖所示參考:

Java中Properties配置檔案讀取

對于最優的放置位置,參考:http://stackoverflow.com/questions/2161054/where-to-place-and-how-to-read-configuration-resource-files-in-servlet-based-app,說:如果propertiesfile是webapp特定的,最好是放置它<code>/WEB-INF/classes</code>。如果您在IDE中開發标準WAR項目,請将其放在<code>src</code>檔案夾(項目的源檔案夾)中。如果你使用Maven項目,将其放在<code>/main/resources</code>檔案夾中。

2、讀取:

①使用java.util.Properties類的load(InputStream in)方法加載properties檔案:

 注意:上面的位址上巧妙的使用了【..】來傳回上一級,并使用此方法替代了servlet特有的方法。

eclips中輸出:

Java中Properties配置檔案讀取

war包輸出:

Java中Properties配置檔案讀取
Java中Properties配置檔案讀取
Java中Properties配置檔案讀取
Java中Properties配置檔案讀取
Java中Properties配置檔案讀取

測試工程:https://github.com/easonjim/5_java_example/tree/master/propertiestest/web

對于操作,這裡不做測試,一般原生方法中,隻有Properties類的store方法。