?
最近項目中有一個這樣的需求,要做一個定時任務功能,定時備份數據庫的操表,將表數據寫入txt文件。因為文件的讀寫路徑可能需要隨時改動,所以寫死或者寫成靜態變量都不方便,就考慮使用配置文件,這里總結些配置文件用法。
一、Java Properties類
1、Java中有個比較重要的的類Properties(java.util.Properties),是代表一個持久的一套詳細屬性,屬性可以被保存到一個流或從流中加載的類。以下是關于屬性的要點:
-
屬性列表中每個鍵及其對應值是一個字符串。
-
一個屬性列表可包含另一個屬性列表作為它的“默認”,第二個屬性可在列表中搜索,如果沒有在原有的屬性列表中找到的屬性鍵。
-
這個類是線程安全的;多個線程可以共享一個Properties對象,而不需要外部同步
-
2、該類的主要方法如下:
3、主要用于讀取Java配置文件,存放一些經常用到的數據,方便程序員修改。該配置文件是個文本文件,后綴名為(.properties),
文件的內容格式為“key=value”,文本注釋可以使用”#“來注釋。如下圖:
?
4、在配置文件中直接寫中文讀取的時候會有亂碼,所以要轉碼成ASCII。eclipse最新版本中會自動轉碼,如果需要手動轉碼,可以借助一些在線轉碼工具,這里推薦一個:
http://tool.oschina.net/encode?type=3
二、Java Properties實例
1、從目標路徑test.properites中獲取輸入流對象
2、使用Properties類的load()方法從字節輸入流中獲取數據
3、直接打印Properties對象
4、使用Properties類的getProperty(String key)方法,根據參數key獲取value
5、具體代碼如下:
package example;import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.net.URLDecoder; import java.net.URLEncoder; import java.util.Properties;public class Test {public static void main(String[] args) {try {Properties prop = new Properties();InputStream in = Test.class.getClassLoader().getResourceAsStream("test.properties");prop.load(in);//直接輸出prop對象System.out.println("直接輸出prop對象:"+prop);//獲取name的值String name=prop.getProperty("name");//獲取address的值String address=prop.getProperty("address");//獲取job的值String job=prop.getProperty("job");System.out.println("name="+name+",address="+address+",job="+job);} catch (IOException e) {// TODO Auto-generated catch block e.printStackTrace();}} }
6、執行結果如下:
從上圖可以看出,job的值是亂碼,說明在配置文件中不可以直接使用中文。還有#號后面的注釋沒有打印出來。
三、關于路徑問題的補充
1、上述獲得Properties配置文件中英文是通過Test.class.getClassLoader().getResourceAsStream()方法直接獲得字節輸入流,所以不用考慮路徑中是否包含中文的問題,如果是通過Test.class.getClassLoader().getResource()方法,因為該方法返回值是URL,如果項目的目錄中有中文命名,則獲得的URL會出現亂碼,所以使用????????
String path=URLDecoder.decode(url.getFile(), "utf-8");
2、具體代碼如下:
package example;import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.net.URLDecoder; import java.net.URLEncoder; import java.util.Properties;public class Test {public static void main(String[] args) {try {Properties prop = new Properties();Properties prop2 = new Properties(); // String path =Test.class.getClassLoader().getResource("example/china/test2.properties").getPath();//獲得URL路徑URL url=Test.class.getClassLoader().getResource("example/china/test2.properties");//打印路徑System.out.println("url.getFile()="+url.getFile());//將路徑中的中文轉碼String path=URLDecoder.decode(url.getFile(), "utf-8");System.out.println("path="+path);//通過路徑獲得字節輸入流InputStream input=new FileInputStream(path);//直接獲得字節輸入流InputStream in = Test.class.getClassLoader().getResourceAsStream("example/china/test2.properties");prop.load(in);prop2.load(input);System.out.println("prop="+prop);System.out.println("prop2="+prop2);} catch (IOException e) {// TODO Auto-generated catch block e.printStackTrace();}} }
3、輸出結果: