一、通過jdk提供的java.util.Properties類。
此類繼承自java.util.HashTable,即實現了Map接口,所以,可使用相應的方法來操作屬性文件,但不建議使用像put、putAll這兩個方法,因爲put方法不僅允許存入String類型的value,還可以存入Object類型的。因此java.util.Properties類提供了getProperty()和setProperty()方法來操作屬性文件,同時使用store或save(已過時)來保存屬性值(把屬性值寫入.properties配置文件)。在使用之前,還需要加載屬性文件,它提供了兩個方法:load和loadFromXML。
load有兩個方法的重載:load(InputStream inStream)、load(Reader reader),所以,可根據不同的方式來加載屬性文件。
可根據不同的方式來獲取InputStream,如:
1、通過當前類加載器的getResourceAsStream方法獲取
- InputStream inStream = TestProperties.class.getClassLoader().getResourceAsStream("test.properties");
2、從文件獲取
- InputStream inStream = new FileInputStream(new File("filePath"));
3、也是通過類加載器來獲取,和第一種一樣
- InputStream in = ClassLoader.getSystemResourceAsStream("filePath");
4、在servlet中,還可以通過context來獲取InputStream
- InputStream in = context.getResourceAsStream("filePath");
5、通過URL來獲取
- URL url = new URL("path");
- InputStream inStream = url.openStream();
- URL url = new URL("path");
- InputStream inStream = url.openStream();
讀取方法如下:
- Properties prop = new Properties();
- prop.load(inStream);
- String key = prop.getProperty("username");
- //String key = (String) prop.get("username");
二、通過java.util.ResourceBundle類來讀取,這種方式比使用Properties要方便一些。
1、通過ResourceBundle.getBundle()靜態方法來獲取(ResourceBundle是一個抽象類),這種方式來獲取properties屬性文件不需要加.properties後綴名,只需要文件名即可。
- ResourceBundle resource = ResourceBundle.getBundle("com/mmq/test");//test爲屬性文件名,放在包com.mmq下,如果是放在src下,直接用test即可
- String key = resource.getString("username");
2、從InputStream中讀取,獲取InputStream的方法和上面一樣,不再贅述。
- ResourceBundle resource = new PropertyResourceBundle(inStream);
注意:在使用中遇到的最大的問題可能是配置文件的路徑問題,如果配置文件入在當前類所在的包下,那麼需要使用包名限定,如:test.properties入在com.mmq包下,則要使用com/mmq/test.properties(通過Properties來獲取)或com/mmq/test(通過ResourceBundle來獲取);屬性文件在src根目錄下,則直接使用test.properties或test即可。
1.Properties類與Properties配置文件
Properties類繼承自Hashtable類並且實現了Map接口,也是使用一種鍵值對的形式來保存屬性集。不過Properties有特殊的地方,就是它的鍵和值都是字符串類型。
2.Properties中的主要方法
(1)load(InputStream inStream)
這個方法可以從.properties屬性文件對應的文件輸入流中,加載屬性列表到Properties類對象。如下面的代碼:
Properties pro = new Properties(); FileInputStream in = new FileInputStream("a.properties"); pro.load(in); in.close();
(2)store(OutputStream out, String comments)
這個方法將Properties類對象的屬性列表保存到輸出流中。如下面的代碼:
FileOutputStream oFile = new FileOutputStream(file, "a.properties"); pro.store(oFile, "Comment"); oFile.close();
如果comments不爲空,保存後的屬性文件第一行會是#comments,表示註釋信息;如果爲空則沒有註釋信息。
註釋信息後面是屬性文件的當前保存時間信息。
(3)getProperty/setProperty
這兩個方法是分別是獲取和設置屬性信息。
3.代碼實例
屬性文件a.properties如下:
name=root pass=liu key=value
讀取a.properties屬性列表,與生成屬性文件b.properties。代碼如下:
1 import java.io.BufferedInputStream; 2 import java.io.FileInputStream; 3 import java.io.FileOutputStream; 4 import java.io.InputStream; 5 import java.util.Iterator; 6 import java.util.Properties; 7 8 public class PropertyTest { 9 public static void main(String[] args) { 10 Properties prop = new Properties(); 11 try{ 12 //讀取屬性文件a.properties 13 InputStream in = new BufferedInputStream (new FileInputStream("a.properties")); 14 prop.load(in); ///加載屬性列表 15 Iterator<String> it=prop.stringPropertyNames().iterator(); 16 while(it.hasNext()){ 17 String key=it.next(); 18 System.out.println(key+":"+prop.getProperty(key)); 19 } 20 in.close(); 21 22 ///保存屬性到b.properties文件 23 FileOutputStream oFile = new FileOutputStream("b.properties", true);//true表示追加打開 24 prop.setProperty("phone", "10086"); 25 prop.store(oFile, "The New properties file"); 26 oFile.close(); 27 } 28 catch(Exception e){ 29 System.out.println(e); 30 } 31 } 32 }