java讀取properties


Java讀取properties文件的方法比較多,網上我最多的文章是“Java讀取properties文件的六種方法”,我看了好多的文章,在讀到“博客之星-熔岩”的“Java讀取properties文件的思考”這片文章的時候,感覺寫的很好,忍不住也些點日志記錄下來,在最常用的讀取properties文件的方式--->“通過java.lang.Class類的getResourceAsStream(String name) 方法來實現”,

Java代碼    收藏代碼
  1. InputStream in = getClass().getResourceAsStream("資源Name");  

 

     這句代碼有一些問題,那就是getClass()調用的時候默認省略了this!我們都知道,this是不能在static(靜態)方法或者static塊中使用的,原因是static類型的方法或者代碼塊是屬於類本身的,不屬於某個對象,而this本身就代表當前對象,而靜態方法或者塊調用的時候是不用初始化對象的。問題是:假如我不想讓某個類有對象,那么我會將此類的默認構造方法設為私有,當然也不會寫別的共有的構造方法。並且我這個類是工具類,都是靜態的方法和變量,我要在靜態塊或者靜態方法中獲取properties文件,這個方法就行不通了。

      那怎么辦呢?其實這個類就不是這么用的,他僅僅是需要獲取一個Class對象就可以了,那還不容易啊--取所有類的父類Object,用Object.class難道不比你的用你正在寫類自身方便安全嗎 ?呵呵,下面給出一個例子,以方便交流。(注:以上的話是摘自於熔岩大哥的話),
Java代碼    收藏代碼
  1. import java.util.Properties;   
  2. import java.io.InputStream;   
  3. import java.io.IOException;   
  4.   
  5. /**  
  6. * 讀取Properties文件的例子  
  7. * File: TestProperties.java  
  8. * User: leizhimin  
  9. * Date: 2008-2-15 18:38:40  
  10. */   
  11. public final class TestProperties {   
  12.     private static String param1;   
  13.     private static String param2;   
  14.   
  15.     static {   
  16.         Properties prop = new Properties();   
  17.         InputStream in = Object.class.getResourceAsStream("/test.properties");   
  18.         try {   
  19.             prop.load(in);   
  20.             param1 = prop.getProperty("initYears1").trim();   
  21.             param2 = prop.getProperty("initYears2").trim();   
  22.         } catch (IOException e) {   
  23.             e.printStackTrace();   
  24.         }   
  25.     }   
  26.   
  27.     /**  
  28.      * 私有構造方法,不需要創建對象  
  29.      */   
  30.     private TestProperties() {   
  31.     }   
  32.   
  33.     public static String getParam1() {   
  34.         return param1;   
  35.     }   
  36.   
  37.     public static String getParam2() {   
  38.         return param2;   
  39.     }   
  40.   
  41.     public static void main(String args[]){   
  42.         System.out.println(getParam1());   
  43.         System.out.println(getParam2());   
  44.     }   
  45. }  
 以上是他的代碼,在我寫的程序中
Java代碼    收藏代碼
  1. public static void main(String[] args) {  
  2. //InputStream inputStream = Object.class.getResourceAsStream("/ipConfig.properties");  
  3.   InputStream inputStream2 = PropertyTest.class.getResourceAsStream("/ipConfig.properties");  
  4.   InputStream inputStream3 = PropertyTest.class.getClassLoader().getResourceAsStream("ipConfig.properties");  
  5.         Properties p = new Properties();  
  6.         try {  
  7.             p.load(inputStream);  
  8.             inputStream.close();  
  9.         } catch (IOException e1) {  
  10.             e1.printStackTrace();  
  11.         }  
  12.         System.out.println("ip:" + p.getProperty("ip") + "port:"  
  13.                 + p.getProperty("port"));  
  14. }  
 對於以上的配置文件的路徑名,有一個容易忽視的問題,那就是當你用Object.class.getClassLoader().get...的時候,是都可以不用要加“/”,但是不用getClassLoader().的時候是不行的,這是什么原因呢?由於這個配置文件是放在項目的src下的,在object加載的時候要加上“/”。如果是將這個配置文件拷貝到類得同包下,則不需要加,如果是用下面的方式讀取配置文件:
Java代碼    收藏代碼
  1. private static final String BUNDLE_NAME = "com.xxx.cs.mm.service.messages";   
  2. messages.properties文件和Messages類在同一個包下,包名:com.xxx.cs.mm.service     
  3.   
  4.  private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);     
  5.   
  6. ublic static String getString(String key) {     
  7.     try {     
  8.         return RESOURCE_BUNDLE.getString(key);     
  9.      } catch (MissingResourceException e) {     
  10.           return '!' + key + '!';     
  11.       }     
  12.  }     
 則必須將配置文件放到和類文件同包下。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM