http://imsnoweagle.blog.sohu.com/108074172.htmljava里面對于類進行調用配置資源的文件數據,以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.iniJAVA里面對于類進行調用配置資源的文件數據,以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/19332489Class.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"));
this.getClass().getResourceAsStream()讀入數據