http://imsnoweagle.blog.sohu.com/108074172.html
JAVA里面对于类进行调用配置资源的文件数据,以this.getClass().getResourceAsStream()来读取比较合适。
路径采用相对路径直接可以从工程的path路径去找。主要问题是如果类中采用的是静态块的话,则该this.getClass()报错,因为读静态块时,可能该对象并为构造,所以用this来指向当前对象不行。
ClassLoader提供了两个方法用于从装载的类路径中取得资源:
public URL getResource(String name);
public InputStream getResourceAsStream(Stringname);
这里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 = newConfigPropManage();
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"));