在我們平時(shí)寫程序的時(shí)候,,有些參數(shù)是經(jīng)常改變的,而這種改變不是我們預(yù)知的,。比如說我們開發(fā)了一個(gè)操作數(shù)據(jù)庫的模塊,在開發(fā)的時(shí)候我們連接本地的數(shù)據(jù)庫那么 IP ,,數(shù)據(jù)庫名稱,,表名稱,數(shù)據(jù)庫主機(jī)等信息是我們本地的,,要使得這個(gè)操作數(shù)據(jù)的模塊具有通用性,,那么以上信息就不能寫死在程序里。通常我們的做法是用配置文件來解決,。各種語言都有自己所支持的配置文件類型,。比如 Python ,他支持 .ini 文件,。因?yàn)樗麅?nèi)部有一個(gè)nfigParser 類來支持 .ini 文件的讀寫,,根據(jù)該類提供的方法程序員可以自由的來操作 .ini 文件。而在 Java 中,, Java 支持的是 .properties 文件的讀寫,。 JDK 內(nèi)置的java.util.Properties 類為我們操作 .properties 文件提供了便利,。
使用J2SE
API讀取Properties文件的六種方法
1。使用java.util.Properties類的load()方法 示例: InputStream
in = lnew BufferedInputStream(new FileInputStream(name)); Properties p =
new Properties(); p.load(in);
2,。使用java.util.ResourceBundle類的getBundle()方法 示例:
ResourceBundle rb = ResourceBundle.getBundle(name,
Locale.getDefault());
3,。使用java.util.PropertyResourceBundle類的構(gòu)造函數(shù) 示例: InputStream
in = new BufferedInputStream(new FileInputStream(name)); ResourceBundle
rb = new PropertyResourceBundle(in);
4。使用class變量的getResourceAsStream()方法 示例: InputStream
in = JProperties.class.getResourceAsStream(name); Properties p =
new Properties(); p.load(in);
5,。使用class.getClassLoader()所得到的java.lang.ClassLoader的getResourceAsStream()方法 示例: InputStream
in = JProperties.class.getClassLoader().getResourceAsStream(name); Properties p =
new Properties(); p.load(in);
6,。使用java.lang.ClassLoader類的getSystemResourceAsStream()靜態(tài)方法 示例: InputStream
in = ClassLoader.getSystemResourceAsStream(name); Properties p =
new Properties(); p.load(in);
補(bǔ)充
Servlet中可以使用javax.servlet.ServletContext的getResourceAsStream()方法 示例:InputStream
in = context.getResourceAsStream(path); Properties p =
new Properties(); p.load(in);
以下為服務(wù)器、數(shù)據(jù)庫信息
dbPort = localhost
databaseName = mydb
dbUserName = root
dbPassword = root
# 以下為數(shù)據(jù)庫表信息
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í)際情況配置的。
以下是操作properties文件的工具類:
- import java.io.BufferedInputStream;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.util.Properties;
-
- /**
- * Java讀寫修改Property文件
- * @author xiewanzhi
- * @date 2011-4-7上午09:19:03
- * @version 1.0
- */
- public class PropertiesConfig {
-
- /**
- * 根據(jù)KEY,,讀取文件對(duì)應(yīng)的值
- * @param filePath 文件路徑,,即文件所在包的路徑,例如:java/util/config.properties
- * @param key 鍵
- * @return key對(duì)應(yīng)的值
- */
- public static String readData(String filePath, String key) {
- //獲取絕對(duì)路徑
- filePath = PropertiesConfig.class.getResource("/" + filePath).toString();
- //截掉路徑的”file:“前綴
- filePath = filePath.substring(6);
- Properties props = new Properties();
- try {
- InputStream in = new BufferedInputStream(new FileInputStream(filePath));
- props.load(in);
- in.close();
- String value = props.getProperty(key);
- return value;
- } catch (Exception e) {
- e.printStackTrace();
- return null;
- }
- }
- /**
- * 修改或添加鍵值對(duì) 如果key存在,,修改, 反之,,添加。
- * @param filePath 文件路徑,,即文件所在包的路徑,,例如:java/util/config.properties
- * @param key 鍵
- * @param value 鍵對(duì)應(yīng)的值
- */
- public static void writeData(String filePath, String key, String value) {
- //獲取絕對(duì)路徑
- filePath = PropertiesConfig.class.getResource("/" + filePath).toString();
- //截掉路徑的”file:/“前綴
- filePath = filePath.substring(6);
- Properties prop = new Properties();
- try {
- File file = new File(filePath);
- if (!file.exists())
- file.createNewFile();
- InputStream fis = new FileInputStream(file);
- prop.load(fis);
- //一定要在修改值之前關(guān)閉fis
- fis.close();
- OutputStream fos = new FileOutputStream(filePath);
- prop.setProperty(key, value);
- //保存,并加入注釋
- prop.store(fos, "Update '" + key + "' value");
- fos.close();
- } catch (IOException e) {
- System.err.println("Visit " + filePath + " for updating " + value + " value error");
- }
- }
-
- public static void main(String[] args) {
- System.out.println(PropertiesConfig.readData("com/xiewanzhi/property/config.properties", "port"));
- // PropertiesConfig.writeData("com/xiewanzhi/property/config.properties", "port", "12345");
- }
- }
|