一:介紹: properties文件在java開發中使用的比較多,主要是一些配置不但願在程序中寫死,而採用 properties文件這樣在不一樣的地方使用只須要修改properties文件而不用修改程序,最日常的 是使用在數據庫配置中或信息配置中,在開發多語言版本的時候也頗有用處,你不一樣的語言版本 使用不一樣的配置文件,這樣你就能夠不修改程序也不用在程序中在判斷,只須要把文件放在 不一樣的地方就可使用。java
二:準備 使用properties文件你須要使用java.util.ResourceBundle充分了解,同時你須要把properties 文件放在classpath中,這樣系統啓動是才能加載文件。程序員
三:加載properties文件 ResourceBundle msgBundle=ResourceBundle.getBundle(msgResource,Locale.CHINA); 使用上面的語句你就能夠加載properties文件文件了,但你必須保證properties 文件放 在classpath中。 同時請參考Java API java.util.ResourceBundle;web
四:使用properties 如今你須要取到properties文件中的內容,使用ResourceBundle裏面的getString() 方法就能夠了。 但須要注意的是getString取到的是ISO字符串,你可能根據須要轉換爲不一樣的字符串。sql
jdbc.driverClassName=com.microsoft.jdbc.sqlserver.SQLServerDriver
jdbc.url=jdbc:microsoft:sqlserver://127.0.0.1:1433;databasename=EVA_MEMBER
jdbc.username=sa
jdbc.password=sa數據庫
import java.io.UnsupportedEncodingException;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;服務器
public class MessageBundle {jsp
private static ResourceBundle msgBundle = null; public MessageBundle(String msgResource) { msgBundle = ResourceBundle.getBundle(msgResource, Locale.CHINA); } public static String getMessage(String _key) { String message = null; try { message = new String(msgBundle.getString(_key) .getBytes("ISO8859_1"), "gb2312"); } catch (MissingResourceException ex) { ex.printStackTrace(); } catch (UnsupportedEncodingException ex) { ex.printStackTrace(); } return message; } public static void main(String[] args) { MessageBundle msg=new MessageBundle("jdbc"); String driver = msg.getMessage("jdbc.driverClassName"); String url = msg.getMessage("jdbc.url"); String username =msg.getMessage("jdbc.username"); String password =msg.getMessage("jdbc.password"); System.out.println(driver); System.out.println(url); System.out.println(username); System.out.println(password); }
} 六:具體運用 1:)鏈接數據庫 在jsp開發中一般鏈接數據庫都是由JavaBean去實現,但你由不但願下次使用這個javabean 去修改.這時候properties文件就頗有做用了。你能夠把數據庫配置放在properties文件中。 這樣就能夠只修改properties而繼續使用JavaBean了。 2網頁風格 建設一個網站一般是須要統一的風格,也就覺得着須要統一的背景色等等,這個時候你把 網頁風格涉及的要素放在peoperties文件中,須要修改一次性修改幾能夠了,或者下次還 有大概相同的網站是否是能夠省修改頁面的時間啊。 3:)信息提示 在開發一個Appaction中出錯提示或者信息提示是必須的,而不少時候你的提示信息,用戶 未必能理解,一開始你又不知道如何用戶能夠理解,這個時候把全部的提示信息放在 properties文件中是一個不錯的提示。 4:)和系統有關的屬性 由於java是能夠在不一樣的平臺上運行的,而不少時候開發和實際運行是在不一樣的平臺,這個函數
時候你就可使用properties文件保存系統屬性,移植也能夠省一些時間。sqlserver
Java讀取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類的構造函數
示例: 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()靜態方法
示例: InputStream in = ClassLoader.getSystemResourceAsStream(name);
Properties p = new Properties();
p.load(in);
補充
Servlet中可使用javax.servlet.ServletContext的getResourceAsStream()方法
示例:InputStream in = context.getResourceAsStream(path);
Properties p = new Properties();
p.load(in);
JProperties.java文件
public class JProperties {
public final static int BY_PROPERTIES = 1;
public final static int BY_RESOURCEBUNDLE = 2;
public final static int BY_PROPERTYRESOURCEBUNDLE = 3;
public final static int BY_CLASS = 4;
public final static int BY_CLASSLOADER = 5;
public final static int BY_SYSTEM_CLASSLOADER = 6;
public final static Properties loadProperties(final String name, final int type) throws IOException {
Properties p = new Properties();
InputStream in = null;
if (type == BY_PROPERTIES) {
in = new BufferedInputStream(new FileInputStream(name));
assert (in != null);
p.load(in);
} else if (type == BY_RESOURCEBUNDLE) {
ResourceBundle rb = ResourceBundle.getBundle(name, Locale.getDefault());
assert (rb != null);
p = new ResourceBundleAdapter(rb);
} else if (type == BY_PROPERTYRESOURCEBUNDLE) {
in = new BufferedInputStream(new FileInputStream(name));
assert (in != null);
ResourceBundle rb = new PropertyResourceBundle(in);
p = new ResourceBundleAdapter(rb);
} else if (type == BY_CLASS) {
assert (JProperties.class.equals(new JProperties().getClass()));
in = JProperties.class.getResourceAsStream(name);
assert (in != null);
p.load(in);
// return new JProperties().getClass().getResourceAsStream(name);
} else if (type == BY_CLASSLOADER) {
assert (JProperties.class.getClassLoader().equals(new JProperties().getClass().getClassLoader()));
in = JProperties.class.getClassLoader().getResourceAsStream(name);
assert (in != null);
p.load(in);
// return new JProperties().getClass().getClassLoader().getResourceAsStream(name);
} else if (type == BY_SYSTEM_CLASSLOADER) {
in = ClassLoader.getSystemResourceAsStream(name);
assert (in != null);
p.load(in);
}
if (in != null) {
in.close();
}
return p;
}
// ---------------------------------------------- servlet used
// ---------------------------------------------- support class
public static class ResourceBundleAdapter extends Properties {
public ResourceBundleAdapter(ResourceBundle rb) {
assert (rb instanceof java.util.PropertyResourceBundle);
this.rb = rb;
java.util.Enumeration e = rb.getKeys();
while (e.hasMoreElements()) {
Object o = e.nextElement();
this.put(o, rb.getObject((String) o));
}
}
private ResourceBundle rb = null;
public ResourceBundle getBundle(String baseName) {
return ResourceBundle.getBundle(baseName);
}
public ResourceBundle getBundle(String baseName, Locale locale) {
return ResourceBundle.getBundle(baseName, locale);
}
public ResourceBundle getBundle(String baseName, Locale locale, ClassLoader loader) {
return ResourceBundle.getBundle(baseName, locale, loader);
在咱們平時寫程序的時候,有些參數是常常改變的,而這種改變不是咱們預知的。好比說咱們開發了一個操做數據庫的模塊,在開發的時候咱們鏈接本地的數據庫那麼 IP ,數據庫名稱,表名稱,數據庫主機等信息是咱們本地的,要使得這個操做數據的模塊具備通用性,那麼以上信息就不能寫死在程序裏。一般咱們的作法是用配置文件來解決。
各類語言都有本身所支持的配置文件類型。好比 Python ,他支持 .ini 文件。由於他內部有一個 ConfigParser 類來支持 .ini 文件的讀寫,根據該類提供的方法程序員能夠自由的來操做 .ini 文件。而在 Java 中, Java 支持的是 .properties 文件的讀寫。JDK 內置的 java.util.Properties 類爲咱們操做 .properties 文件提供了便利。
一. .properties 文件的形式 ==========================================================
dbPort = localhost
databaseName = mydb
dbUserName = root
dbPassword = root
dbTable = mytable
ip = 192.168.0.9
······
在上面的文件中咱們假設該文件名爲: test.properties 文件。其中 # 開始的一行爲註釋信息;在等號「 = 」左邊的咱們稱之爲key ;等號「 = 」右邊的咱們稱之爲 value 。(其實就是咱們常說的鍵 - 值對) key 應該是咱們程序中的變量。而 value 是咱們根據實際狀況配置的。 二. JDK 中的 Properties 類 Properties 類存在於胞 Java.util 中,該類繼承自 Hashtable ,它提供了幾個主要的方法: 1. getProperty ( String key) , 用指定的鍵在此屬性列表中搜索屬性。也就是經過參數 key ,獲得 key 所對應的 value 。
2. load ( InputStream inStream) ,從輸入流中讀取屬性列表(鍵和元素對)。經過對指定的文件(好比說上面的 test.properties 文件)進行裝載來獲取該文件中的全部鍵 - 值對。以供 getProperty ( String key) 來搜索。 3. setProperty ( String key, String value) ,調用 Hashtable 的方法 put 。他經過調用基類的put方法來設置 鍵 - 值對。
4. store ( OutputStream out, String comments) , 以適合使用 load 方法加載到 Properties 表中的格式,將此 Properties 表中的屬性列表(鍵和元素對)寫入輸出流。與 load 方法相反,該方法將鍵 - 值對寫入到指定的文件中去。
5. clear ()
,清除全部裝載的 鍵 - 值對。該方法在基類中提供。
有了以上幾個方法咱們就能夠對 .properties 文件進行操做了!
簡單實例:
Java代碼 收藏代碼 package cn.net.yans.common.util;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
/**
*/
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(this.getClass().getClassLoader() .getResource(filePath).getPath()); propertie.load(inputFile); inputFile.close(); } catch (FileNotFoundException ex) { System.out.println("讀取屬性文件--->失敗!- 緣由:文件路徑錯誤或者文件不存在"); ex.printStackTrace(); } catch (IOException ex) { System.out.println("裝載文件--->失敗!"); ex.printStackTrace(); } }// end ReadConfigInfo(...) /** * 重載函數,獲得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(...) /** * 重載函數,獲得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(...) /** * 將更改後的文件數據存入指定的文件中,該文件能夠事先不存在。 * * @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) throws IOException { Configuration rc = new Configuration("powers.properties"); String[] powerList = rc.getValue("list").split(","); for (String po : powerList) { System.out.println(po); } }
}
路徑相關問題:
在java中使用相對路徑 無標題文檔 ? 在開發過程當中,咱們常常會遇到讀取配置文件的狀況,對於配置文件的讀取,根據環境等狀況又各有不一樣,通常狀況下,若是從非jar包中使用相對/路徑,比較簡單,就不在累述了,而在不少 狀況下,咱們須要把咱們的class打包成jar文件,進行使用,這時就會發現,咱們先前若是沒有考慮到這些,可能就行不通了,那麼,該如何解決呢?方法以下 : 有以下路徑 : Web-info--|-->classes--->conf-->config.properties |-->lib 此時加入咱們須要讀取config.properties,在不使用jar包時,使用以下方式讀取,不失爲一種方法: File f = new File(this.getClass().getResource("/").getPath()); f = new File(f.getPath() + "/conf/config.properties");
或者:(this.getClass().getClassLoader().getResource(fileName).getPath())
注:f.getPath()即爲當class所在的絕對路徑。如:c:\javasrc\web-inf\classes 而後,對文件對象進行處理,就能把配置信息讀取出來了,可是加入如上class被打包成jar文件,那麼,在程序執行到這裏時,就會沒法找到配置文件,那麼該如何處理呢? 處理方法以下: String s_config="conf/config.properties"; InputStream in = ClassLoader.getSystemResourceAsStream(s_config); if( in == null ){ System.out.println( " 打開 " + s_config + "失敗!" ); }else { Properties properties = new Properties(); properties.load(in); // //接下來就能夠經過properties.getProperty(String obj)方法對進行配置信息讀取了
System.getProperty ("user.dir" )當前用戶目錄的相對路徑。
this.getClass().getResource("") 到的也是當前ClassPath 的絕對URI 路徑。
ClassLoader.getSystemResource("") 到的也是當前ClassPath 的絕對URI 路徑。
Thread.currentThread().getContextClassLoader().getResource("") 到的也是當前ClassPath 的絕對URI 路徑。
讀取Properties 文件的方法
使用java.util.Properties 類的load() 方法 示例: InputStream in = lnew BufferedInputStream(new FileInputStream(name)); Properties p = new Properties(); p.load(in);
使用java.util.ResourceBundle 類的getBundle() 方法 示例: ResourceBundle rb = ResourceBundle.getBundle(name, Locale.getDefault());
使用java.util.PropertyResourceBundle 類的構造函數 示例: InputStream in = new BufferedInputStream(new FileInputStream(name)); ResourceBundle rb = new PropertyResourceBundle(in);
使用class 變量的getResourceAsStream() 方法 示例: InputStream in = JProperties.class.getResourceAsStream(name); Properties p = new Properties(); p.load(in);
使用class.getClassLoader() 所獲得的java.lang.ClassLoader 的getResourceAsStream() 方法。
示例:
InputStream in = JProperties.class.getClassLoader().getResourceAsStream(name); Properties p = new Properties(); p.load(in);
7.Servlet 中可使用javax.servlet.ServletContext 的getResourceAsStream() 方法 示例: InputStream in = context.getResourceAsStream(path); Properties p = new Properties();
p.load(in);
空格
//得到文件路徑,並對路徑進行處理 private static String getUrl() { String path = configLoad.class.getResource("config.properties").toString(); path = path.replace("%20", " "); //引號中有一個半角的空格 path = path.substring(6); return path; } } 那麼這裏返回了一個Properties類型的值,在這裏就可使用getProperty()來得到值 如:Properties pro = configLoad.getConfig(); String http = pro.getProperty("url").toString();
總 結:java的properties文件須要放到classpath下面,這樣程序才能讀取到,有關classpath實際上就是java類或者庫的存放 路徑,在java工程中,properties放到class文件一塊。在web應用中,最簡單的方法是放到web應用的WEB-INF/classes 目錄下便可,也能夠放在其餘文件夾下面,這時候須要在設置classpath環境變量的時候,將這個文件夾路徑加到classpath變量中,這樣也也可 以讀取到。在此,你須要對classpath有個深入理解,classpath絕非系統中刻意設定的那個系統環境變量,WEB-INF/classes其 實也是,java工程的class文件目錄也是