this.getClass().getResourceAsStream()读入数据

this.getClass().getResourceAsStream()读入数据

(2014-11-05 13:35:13)

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"));

猜你喜欢

转载自blog.csdn.net/zxl2016/article/details/80092402