`
xixinfei
  • 浏览: 414095 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

this.class.getClassLoader().getResourceAsStream

 
阅读更多

this.getClass().getClassLoader().getResource("template");
   首先,调用对象的getClass()方法是获得对象当前的类类型,这部分数据存在方法区中,而后在类类型上调用getClassLoader()方法是得到当前类型的类加载器,我们知道在Java中所有的类都是通过加载器加载到虚拟机中的,而且类加载器之间存在父子关系,就是子知道父,父不知道子,这样不同的子加载的类型之间是无法访问的(虽然它们都被放在方法区中),所以在这里通过当前类的加载器来加载资源也就是保证是和类类型同一个加载器加载的。
最后调用了类加载器的getResourceAsStream()方法来加载资源。

===

JAVA运行时,首先会在指定的类路径下(classpath路径下)搜索JAVA编译后的字节码文件(class文件),然后通过类加载器加载到虚拟机中。 DBConn.class.getClassLoader().getResourceAsStream("database.properties") 1、DBConn.class得到表示DBConn类的Class对象,请参照JDK中对Class的说明http://wenku.baidu.com/view/1fa5e8ebe009581b6bd9ebe1.html。 2、通过Class的getClassLoader方法取得加载DBConn类的类加载器对象ClassLoader。 3、调用ClassLoader的getResourceAsStream方法从类加载路径取得文件的输入流(会通过当前的ClassLoader的findResource方法查找指定文件),请参照:http://download.oracle.com/javase/1.5.0/docs/api/java/lang/ClassLoader.html#getResourceAsStream%28java.lang.String%29

===

//下面的JdbcUtils.class后面少了个()吗?应该是都可以

   Properties prop = new Properties();
   prop.load(JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties"));
   String driver = prop.getProperty("driver");
   Class.forName(driver);

====

  1. [原创]关于ClassName.class.getClassLoader的几点说明.    
  2. 经常希望通过ClassName.class.getClassLoader().getResourceAsStream(““)来取得properties文件.通常:ClassName.class.getClassLoader().getResourceAsStream(““)取得的是WEB-INF的下级目录,比如ClassName.class.getClassLoader().getResourceAsStream(“db.properties“).在Tomcat中,可以通过增加”../”来取得上层目录,即WEB-INF目录,这样就可以把properties放在WEB-INF中统一管理。但是WLS不识别”../”。   
  3. 另外一种土办法,就是不返回classLoader,直接ClassName.class.getResourceAsStream()。然后通过多个”../”(小于6个)来返回相应的上级目录。   
  4. 当然,如果类扩展了HttpServlet,可以通过getServletContext().getRealPath("/")来取得Web部署目录的绝对路径。

====

因此,直接调用 this.getClass().getResourceAsStream(String name);获取流,静态化方法中则使用ClassLoader.getSystemResourceAsStream(String name); 。

====

 在JDK中,getResourceAsStream是这样定义的:查找具有给定名称的资源。查找与给定类相关的资源的规则是通过定义类的 class loader 实现的。
  因为我是用txt文件当作字典,它存在一个叫dict.aspactword的包下,这样一来,编译后的文件会储存在classPath下,而不是在src下,在动态向字典添加词的时候,classPath下的txt字典没有改变,相对在getResourceAsStream的时候,拿到的自然不是最新的字典,由此感叹,在classPath下如果有不需要改变的文件,在读取时用getResourceAsStream可以保持系统良好的统一性和可移植性,但是在需要改变它们的时候,一定注意修改的路径是classPath下的文件,否则就直接用文件系统的位置来维护你所需要的文件吧

====

常见的有以下两种获取资源文件的方法:

App.class.getClassLoader().getResourceAsStream(String name)

 

 

Returns an input stream for reading the specified resource.

The search order is described in the documentation for getResource(String).

 

默认从classpathe中找文件,name不能带“/”,否则会抛空指针

 

App.class.getResourceAsStream(String name):

 

查找资源通过给定名称,查询资源的规则与给定的类的class load来实现,这个方法由类的loader来执行,如果这个类由bootstrap加载,那么方法由ClassLoader.getSystemResourceAsStream代理执行。

 

代理之前,绝对的资源名称通过传入的name参数以下算法进行构造:

 

如果name以"/"开头,那么绝对路径是/后边跟的名字

如果name不是以"/"开头,那么绝对路径是package名"."换成“/”以后再加name,例如:

 

com.abc.App就是/com/abc/App/name

分享到:
评论
1 楼 yadongliang 2017-11-29  
  

相关推荐

    Java 使用getClass().getResourceAsStream()方法获取资源

    3. `InputStream is = this.getClass().getClassLoader().getResourceAsStream(fileName);` 这种方法使用了`ClassLoader`来查找资源,同样也是从类路径的根开始。`ClassLoader`是Java用来加载类和资源的对象,它...

    Java连接数据库代码

    in = MyTask.class.getClassLoader().getResourceAsStream("db.properties"); prop.load(in); this.sql_ip=prop.getProperty("DB_IP").trim(); this.sql_db_name=prop.getProperty("DB_NAME").trim(); this.sql...

    java工厂系列设计模式源码与文档

    Document document = sb.build(this.getClass().getClassLoader().getResourceAsStream(fileName)); Element root = document.getRootElement(); List list = XPath.selectNodes(root, "/beans/bean"); for...

    pull解析XML

    List<WeatherInfos> infos = weatherService.getWeatherInfos(MainActivity.class.getClassLoader().getResourceAsStream("z.xml")); StringBuffer sb = new StringBuffer(); for(WeatherInfos info : infos){ ...

    Spring原理模拟代码

    Document doc = sb.build(this.getClass().getClassLoader() .getResourceAsStream("beans.xml")); Element root = doc.getRootElement();// 获取根元素 List<?> list = root.getChildren("bean");// 获取...

    读取jar文件

    - 使用当前类的类加载器:`this.getClass().getClassLoader().getResourceAsStream(path)` - 使用当前类作为起点:`this.getClass().getResourceAsStream(path)` 或 `this.getClass().getResource(path)` - 直接...

    Mybatis源码分析.md

    InputStream inputStream = CommonTest.class.getClassLoader().getResourceAsStream("mybatis-configuration.xml"); ``` 这里通过Java类加载器获取到名为`mybatis-configuration.xml`的配置文件,并将其内容转换...

    API读取Properties文件的六种方法

    InputStream in = ClassLoaderResourceExample.class.getClassLoader().getResourceAsStream(name); Properties p = new Properties(); p.load(in); // 示例:获取配置文件中的属性 String dbUrl = p....

    关于java和web工程项目中各种路径的获取总结借鉴.pdf

    InputStream is = TestAction.class .getClassLoader().getResourceAsStream("test.txt"); ``` 这里假设有一个名为`TestAction`的类,你需要找到与其处于同一包内的`test.txt`文件。这段代码会从`TestAction`...

    Spring Boot读取resources目录文件方法详解

    使用getContextClassLoader().getResourceAsStream()可以自动管理文件路径,但需要使用Thread.currentThread().getContextClassLoader()方法来获取ClassLoader对象。希望本文能够对大家的学习和工作产生一定的参考...

    spring 启动时加载不同的文件

    InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("deploy.properties"); // 读取deploy.properties文件 try { prop.load(inputStream); String dataSource = prop....

    spring3工作原理

    Document doc = sb.build(this.getClass().getClassLoader().getResourceAsStream("beans.xml")).getDocument(); Element root = doc.getRootElement(); List<Element> list = root.getChildren("bean"); for ...

    S08-SnakeYaml反序列化1

    InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream("test.yaml"); Object load = yaml.load(resourceAsStream); System.out.println(load); } } ``` **5. 反序列化漏洞** ...

    JDBC如何获取数据库连接

    InputStream is = this.getClass().getClassLoader().getResourceAsStream("setting.properties"); Properties setting = new Properties(); setting.load(is); // 2. 从 Properties 对象中读取需要的连接信息 ...

    获取路径的各种方法

    4. `this.getClass().getClassLoader().getResource("").getPath()`:这个方法适用于任何Java类,无论是在JSP、Servlet还是普通的Java文件中,它能获取到工程的"class"目录下的路径。 5. `request.getParameter("")...

    dwr实现密码找回功能

    InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("db.properties"); Properties p = new Properties(); try { p.load(inputStream); inputStream.close(); } catch ...

    java classloader classpath 张孝祥

    3. `this.getClass().getClassLoader().getResource("")`:同样获取当前类路径的根路径,如`file:/D/workspace/jbpmtest3/bin/`。 4. `ClassLoader.getSystemResource("")`:获取系统类路径的根路径,如`file:/D/...

    Java读取资源文件时内容过长与换行的处理

    input = Test.class.getClassLoader().getResourceAsStream("test.properties"); if (input != null) { // 加载properties文件 prop.load(input); } // 获取属性值 String name = prop.getProperty("name");...

Global site tag (gtag.js) - Google Analytics