this.getClass().getResourceAsStream()讀入數據

轉載出處:傳送門

JAVA裏面對於類進行調用配置資源的文件數據,以this.getClass().getResourceAsStream()來讀取比較合適。
路徑採用相對路徑直接可以從工程的path路徑去找。主要問題是如果類中採用的是靜態塊的話,則該this.getClass()報錯,因爲讀靜態塊時,可能該對象併爲構造,所以用this來指向當前對象不行。
ClassLoader提供了兩個方法用於從裝載的類路徑中取得資源:
  public URL getResource(String name);
  public InputStream getResourceAsStream(String name);
這裏name是資源的類路徑,它是相對與“/”根路徑下的位置。getResource得到的是一個URL對象來定位資源,而getResourceAsStream取得該資源輸入流的引用保證程序可以從正確的位置抽取數據。
舉例說明:
  mypackage.Hello.class.getResourceAsStream("/config/config.ini");
從classpath下的config相對路徑中讀取config.ini
JAVA裏面對於類進行調用配置資源的文件數據,以this.getClass().getResourceAsStream()來讀取比較合適。

 

http://baoqiang2004.blog.163.com/blog/static/16819372920111130110722/
(1).new FileInputStream(“a.txt”)
那麼,這個a.txt就應該在工程的根目錄下.
(2).this.getClass().getClassLoader().getResourceAsStream(“a.txt”)
在bin目錄下,或加載類的地方–包外
(3).this.getClass().getResourceAsStream(“a.txt”)
在bin目錄下,或加載類的地方–包內
getResourceAsStream:其本質是,根據類所在的位置,去加載配置文件所在的位置,

 

http://ouyangfei0426.iteye.com/blog/1020232

http://blog.csdn.net/zhanghaipeng1989/article/details/19332489
Class.getResourceAsStream() 會指定要加載的資源路徑與當前類所在包的路徑一致。
例如你寫了一個MyTest類在包com.test.mycode 下,那麼MyTest.class.getResourceAsStream("name") 會在com.test.mycode包下查找相應的資源
如果這個name是以 '/' 開頭的,那麼就會從classpath的根路徑下開始查找
1. Class.getResourceAsStream(String path) :
path 不以'/'開頭時默認是從此類所在的包下取資源,以'/'開頭則是從ClassPath(Src根目錄)根下獲取。
其只是通過path構造一個絕對路徑,最終還是由ClassLoader獲取資源。
    

http://hi.baidu.com/lzpsky/item/6ae30e5dec024c3494eb0526


工程的文件結構:
testjee
  src
      config
          config1.properties
      configproperty
          ConfigPropManage.java
          config2.properties
          config
              config4.properties
      config3.properties

代碼:

package configproperty;
public class ConfigPropManage {
 private static ConfigPropManage instance = new ConfigPropManage();
 private ConfigPropManage() {
 }
 public static ConfigPropManage getInstance() {
  return instance;
 }
 
  public static void main(String[] args) {
  ConfigPropManage instance = ConfigPropManage.getInstance();

    //  當前包路徑, 得到的是當前類class文件的URI目錄。不包括自己
  //out: file:/D:/workplace-Ec/workspace_jee/testjee/bin/configproperty/
  System.out.println(instance.getClass().getResource(""));
    // 當前類路徑, 得到的是當前的classpath的絕對URI路徑
  //out: file:/D:/workplace-Ec/workspace_jee/testjee/bin/
  System.out.println(instance.getClass().getResource("/"));
  

 ////////////////////////////////////////////////config1.properties///////////////////////////////
  //不加“/”,則表示從當前類所在的包configproperty下查找該資源config/config1.properties。沒找到.
  //out: 11:null
  System.out.println("11:"+instance.getClass().getResourceAsStream("config/config1.properties"));
  
  //加“/”,則表示從類路徑下也就是從classes文件夾下查找資源,找到。
  //out: 12:java.io.BufferedInputStream@37a71e93
  System.out.println("12:"+instance.getClass().getResourceAsStream("/config/config1.properties"));
  
  //加“/”,則表示從類路徑下也就是從classes文件夾下查找資源,沒找到。
  System.out.println("13:"+instance.getClass().getResourceAsStream("/config1.properties"));
  
  //不加“/”,則表示從當前類所在的包configproperty下查找該資源config1.properties。沒找到.
  System.out.println("14:"+instance.getClass().getResourceAsStream("config1.properties"));
  
  //加“/”,則表示從類路徑下也就是從classes文件夾下查找資源,沒找到。
  System.out.println("15:"+instance.getClass().getResource("/config1.properties")); 
  
  //不加“/”,則表示從當前類所在的包configproperty下查找該資源config1.properties。沒找到.
  System.out.println("16:"+instance.getClass().getResource("config1.properties")); 
  
  //加“/”,則表示從類路徑下也就是從classes文件夾下查找資源,沒找到。
  //out: 17:file:/D:/workplace-Ec/workspace_jee/testjee/bin/config/config1.properties
  System.out.println("17:"+instance.getClass().getResource("/config/config1.properties")); 
  
  //不加“/”,則表示從當前類所在的包configproperty下查找該資源config/config1.properties。沒找到.
  System.out.println("18:"+instance.getClass().getResource("config/config1.properties"));  
 

 ////////////////////////////////////////////////config2.properties//////////////////////////////////
  //加“/”,則表示從類路徑下也就是從classes文件夾下查找資源,沒找到。
  System.out.println("23:"+instance.getClass().getResourceAsStream("/config2.properties"));
  
  //文件名前不加“/”,則表示從當前類所在的包configproperty下查找該資源config2.properties。找到.
  //out: 24:java.io.BufferedInputStream@7c3df479
  System.out.println("24:"+instance.getClass().getResourceAsStream("config2.properties"));
  
  //加“/”,則表示從類路徑下也就是從classes文件夾下查找資源,沒找到。
  System.out.println("25:"+instance.getClass().getResource("/config2.properties")); 
  
  //文件名前不加“/”,則表示從當前類所在的包configproperty下查找該資源config2.properties。找到
  //out: 26:file:/D:/workplace-Ec/workspace_jee/testjee/bin/configproperty/config2.properties
  System.out.println("26:"+instance.getClass().getResource("config2.properties"));   

 

 ////////////////////////////////////////////////config3.properties/////////////////////////////////
    //加“/”,則表示從類路徑下也就是從classes文件夾下查找資源config3,找到。
    //out: 33:java.io.BufferedInputStream@7106e68e
  System.out.println("33:"+instance.getClass().getResourceAsStream("/config3.properties"));
  
  //文件名前不加“/”,則表示從當前類所在的包configproperty下查找該資源config3.properties。沒找到
  System.out.println("34:"+instance.getClass().getResourceAsStream("config3.properties"));
  
  //加“/”,則表示從類路徑下也就是從classes文件夾下查找資源config3,找到。
  //out: 35:file:/D:/workplace-Ec/workspace_jee/testjee/bin/config3.properties
  System.out.println("35:"+instance.getClass().getResource("/config3.properties")); 
  
  //文件名前不加“/”,則表示從當前類所在的包configproperty下查找該資源config3.properties。沒找到
  System.out.println("36:"+instance.getClass().getResource("config3.properties"));  

 

 ////////////////////////////////////////////////config4.properties////////////////////////////////////
  //不加“/”,則表示從當前類所在的包configproperty下查找該資源config/config4.properties。找到
  //out: 41:java.io.BufferedInputStream@7e6cbb7a
  System.out.println("41:"+instance.getClass().getResourceAsStream("config/config4.properties"));
  
  //加“/”,則表示從類路徑下也就是從classes文件夾下查找資源config/config4.properties,沒找到。
  System.out.println("42:"+instance.getClass().getResourceAsStream("/config/config4.properties"));
  
  //加“/”,則表示從類路徑下也就是從classes文件夾下查找資源config4.properties,沒找到。
  System.out.println("43:"+instance.getClass().getResourceAsStream("/config4.properties"));
  
  //文件名前不加“/”,則表示從當前類所在的包configproperty下查找該資源config4.properties。沒找到
  System.out.println("44:"+instance.getClass().getResourceAsStream("config4.properties"));
  
  //加“/”,則表示從類路徑下也就是從classes文件夾下查找資源,沒找到。
  System.out.println("45:"+instance.getClass().getResource("/config4.properties")); 
  
  //文件名前不加“/”,則表示從當前類所在的包configproperty下查找該資源config4.properties。沒找到
  System.out.println("46:"+instance.getClass().getResource("config4.properties")); 
  
  //加“/”,則表示從類路徑下也就是從classes文件夾下查找資源,沒找到。
  System.out.println("47:"+instance.getClass().getResource("/config/config4.properties")); 
  
  //不加“/”,則表示從當前類所在的包configproperty下查找該資源config/config4.properties。找到
  //out: 48:file:/D:/workplace-Ec/workspace_jee/testjee/bin/configproperty/config/config4.properties
  System.out.println("48:"+instance.getClass().getResource("config/config4.properties")); 

 }
 }


疑問:
      //如果類路徑下的當前包有22.properties文件,則輸出:6: file:/E:/myobject/myspider/build/classes/myspider/22.properties 
     //否者輸出源文件下的22.properties文件的路徑,則輸出:6:file:/E:/myobject/myspider/src/myspider/22.properties 
    System.out.println("6:"+t.getClass().getResource("22.properties"));  
 
    //如果類路徑下有11.properties文件,則輸出7:file:/E:/myobject/myspider/build/classes/11.properties 
    //否者輸出源文件下的11.properties文件的路徑,則輸出:7:file:/E:/myobject/myspider/src/11.properties 
    System.out.println("7:"+t.getClass().getResource("/11.properties"));


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章