`

getResource和getResourceAsStream文件路径分析

    博客分类:
  • java
阅读更多

一,简介

       在JDK中,提供了以下方法来获取classpath下的资源:

     

public abstract class ResourceUtils
{
    public static void main(String[] args)
    {
        test();
    }
    /**
     * @param args
     */
    public static void test()
    {
        String name = "plugins.xml";
        System.out.println(null != Thread.currentThread().getContextClassLoader().getResource(name));//相对于classpath根路径
        System.out.println(null != Thread.currentThread().getContextClassLoader().getResourceAsStream(name));//相对于classpath根路径
        System.out.println(null != ResourceUtils.class.getResource(name));//相对于ResourceUtils.class文件所在包路径。如果name="/plugins.xml"则是相对于classpath根路径
        System.out.println(null != ResourceUtils.class.getResourceAsStream(name));//相对于ResourceUtils.class文件所在包路径。如果name="/plugins.xml"则是相对于classpath根路径
    }
}

    其中ResourceUtils.class.getResource(name),ResourceUtils.class.getResourceAsStream(name)最终还是委托给ClassLoader的getResource和getResourceAsStream去加载资源的。只不过在委托给ClassLoader加载资源之前,对资源的路径进行了一些特殊的处理。

二,ClassLoader资源加载原理

  

public abstract class ClassLoader {
// The parent class loader for delegation
private ClassLoader parent;
public URL getResource(String name) {
	URL url;
	if (parent != null) {
	    url = parent.getResource(name);//委托给父加载器加载资源
	} else {
	    url = getBootstrapResource(name);//委托给根加载器加载资源
	}
	if (url == null) {
	    url = findResource(name);//自己去加载资源
	}
	return url;
    }
}

   众所周知,JVM中不同ClassLoader所加载资源的路径是不同的,BootstrapClassloader(根类加载器)资源加载路径为:C:\Program Files\Java\jdk1.7.0_17\jre\lib文件夹。例如:rt.jar,jce.jar等;ExtClassLoader(扩展类加载器)资源加载路径为:C:\Program Files\Java\jdk1.7.0_17\jre\lib\ext文件夹;SystemClassLoader(系统类加载器):应用中编写的class类,引用的第三方jar包均由系统类加载器加载。

   由代码中ClassLoader获取资源的优先级可知,如果不同ClassLoader加载的资源路径下存在同名的配置文件或class文件,覆盖顺序为:根类加载器 > 扩展类加载器 > 应用中的资源文件 > 应用所依赖的第三方jar (这也是JVM保证安全性的原则,否则恶意定义一个java.lang.String的类,被JVM加载是不安全的)

  例如:A工程依赖B工程,在B工程中的classpath下有个配置文件plugins.xml,同时在A工程的classpath下也有一个同名的配置文件,那么A工程下的配置文件则会覆盖B下的文件。同样包路径的class文件也会覆盖。

 

三,Class资源加载原理

  

public final
    class Class<T> implements java.io.Serializable, 
			      java.lang.reflect.GenericDeclaration, 
			      java.lang.reflect.Type,
                              java.lang.reflect.AnnotatedElement {

    public java.net.URL getResource(String name) {
        name = resolveName(name);//对name进行路径特殊处理
        ClassLoader cl = getClassLoader0();
        if (cl==null) {
            // A system class.
            return ClassLoader.getSystemResource(name);
        }
        return cl.getResource(name);//最终还是委托给ClassLoader加载资源
    }

     /**
     * Add a package name prefix if the name is not absolute Remove leading "/"
     * if name is absolute
     */
    private String resolveName(String name) {
        if (name == null) {
            return name;
        }
        if (!name.startsWith("/")) {//如果不是绝对路径,即相对于classpath根路径
            Class c = this;
            while (c.isArray()) {
                c = c.getComponentType();
            }
            String baseName = c.getName();//取当前类路径lpp.demo.ResourceUtils
            int index = baseName.lastIndexOf('.');//lpp.demo
            if (index != -1) {
                name = baseName.substring(0, index).replace('.', '/')
                    +"/"+name;//路径:lpp/demo/pluginxs.xml
            }
        } else {
            name = name.substring(1);//路径:pluginxs.xml
        }
        return name;
    }

}

 

      

 

      

分享到:
评论

相关推荐

    java-loadresource.rar

    Java加载资源文件的两种方法getResource与getResourceAsStream

    getResourceAsStream

    java getResourceAsStream种类,分我所知道的3种情况

    javaEE-web的文件路径

    javaEE-web的文件路径, 用getClass().getResourceAsStream("/")来确定文件路径 并用jdom读取xml和下载1

    Java中getResourceAsStream用法分析

    主要介绍了Java中getResourceAsStream用法,较为详细的分析了getResourceAsStream的功能及用法,需要的朋友可以参考下

    Java中getResourceAsStream的用法.md

    Java中getResourceAsStream的用法.md

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

    主要介绍了Java 使用getClass().getResourceAsStream()方法获取资源的相关资料,这里主要讲解哪种方式可以获取到文件资源,需要的朋友可以参考下

    加载资源文件类

    资源文件加载类 这里是用的是class getResourceAsStream &quot;path&quot; 来加载资源文件的

    activiti部署中文乱码解决,亲测有效,替换三个文件

    activiti部署中文乱码解决,亲测有效, 1.activiti-webapp-explorer2\src\main\webapp\editor-app\i18n下en.json 2.activiti-webapp-explorer2\src\main\resources下 activiti-custom-context.xml ...替换三个文件.

    java加载属性配置文件(properties文件)——从入门到进阶

    java加载属性配置文件[properties文件]什么是properties文件为什么要使用properties文件使用java加载properties文件的两种方式使用类的加载器获得输入流加载文件getResourceAsStream()介绍使用文件输入流加载文件...

    java读取配置文件的实例代码

    java项目读取配置文件的实例代码,使用class.getClassLoader().getResourceAsStream方法。

    使用J2SE API读取Properties文件的六种方法

    ResourceBundle rb = ResourceBundle.getBundle(name, Locale.getDefault());  3。使用java.util.PropertyResourceBundle类的构造函数  示例: InputStream in = new BufferedInputStream(new FileInputStream...

    MyBatis3.2.3帮助文档(中文版).zip

    但是也可以使用任意的输入流(InputStream)实例,包括字符串形式的文件路径或者 file:// 的 URL 形式的文件路径来配置。MyBatis 包含一个名叫 Resources 的工具类,它包含一些实用方法,可使从 classpath 或其他位置...

    java类读取配置文件信息

    在java类里直接读取配置文件中的信息,用到的方法是this.getClass().getClassLoader().getResourceAsStream

    Mybatis源码分析.md

    InputStream inputStream = CommonTest.class.getClassLoader().getResourceAsStream("mybatis-configuration.xml"); SQLSessionFactory SQLSessionFactory = new SQLSessionFactoryBuilder().build(inputStream)...

    Java简单音乐播放器播放wav文件示例.rar

    一个挺简单的Java音乐播放器,主要是播放wav格式的音频文件,其它格式暂不支持,代码比较早,确实是比较简单的例子,Java新手参考吧。源代码如下所示:  public MusicDemo() {  textbox=new TextBox("title",...

    day020-继承加强和设计模式代码和笔记.rar

    2、InputStream is = classLoader.getResourceAsStream("文件路径/文件名");//通过当前线程的类加载器获取流对象,如果是源文件夹,直接文件名 建议用当前线程类的加载器方式获取流,线程安全问题 ...

    Activiti modeler 设计器汉化文件

    Activiti modeler 设计器汉化文件。引入方式:修改StencilsetRestResource中的InputStream stencilsetStream = this.getClass().getClassLoader().getResourceAsStream("stencilset.json.zh-cn");

    图书馆管理系统

    InputStream in=getClass().getResourceAsStream(propFileName); prop.load(in); //通过输入流对象加载Properties文件 dbClassName = prop.getProperty("DB_CLASS_NAME"); //获取数据库驱动 dbUrl =...

    aspose pdf 10.8.0 for java

    刚开始简单破解了一下。 生成PDF都没问题,后来发现生成... InputStream is = XXX.class.getResourceAsStream("/pdflicense.xml"); license.setLicense(is); is.close(); 其中pdflicense.xml已经包含在jar文件里面

    dom4j.jar.jar

    XML用于保存及交换数据,与读取配置文件的类在同一包,或在WEB-INF(或其子目录下),// 读取配置文件获得一个输入流 InputStream is = Demo1.class.getResourceAsStream("/students.xml");// src目录下 // 1. 获得...

Global site tag (gtag.js) - Google Analytics