`

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文件路径获取

    本文将详细介绍Java中获取文件路径的各种方法及其应用场景,帮助开发者更好地理解和掌握这些技巧。 #### 二、基本概念 在深入讨论之前,我们需要了解几个基本概念: - **Classpath**: 是Java运行环境的一个重要...

    JAVA中如何得到文件路径.pdf

    ### JAVA中如何获取文件路径详解 #### 一、概述 在Java编程中,获取文件路径是一项基础而重要的技能。无论是处理本地文件还是部署在Web容器中的应用,了解如何正确地获取文件路径对于程序的正常运行至关重要。本文...

    JavaWeb_servlet(11)_ 通过 ServletContex 获得类路径下的文件路径

    2. `getResource()`和`getResourceAsStream()`:这两个方法用于获取URL资源和对应的输入流。如果你只想读取文件内容,而不需要文件系统路径,可以使用它们。例如: ```java ServletContext context = ...

    java-loadresource.rar

    本篇文章将详细探讨Java提供的两种主要方法:`Class.getResource`和`Class.getResourceAsStream`,用于加载类路径下的资源文件。 首先,`Class.getResource`方法返回一个`URL`对象,它表示资源的位置。这个方法接受...

    Java文件路径详解

    Java 文件路径详解是 Java 中获取文件路径的方式,包括 Class.getResourceAsStream() 和 ClassLoader.getResourceAsStream() 两种方法。这些方法可以帮助开发者快速获取文件路径,以便于读取文件的内容。

    JAVA获取文件绝对路径的方法

    当你需要获取与类相关的资源文件的绝对路径时,可以使用 `Class.getResource()` 或 `Class.getResourceAsStream()` 方法。这些方法返回一个 `java.net.URL` 对象,可以通过调用 `getPath()` 来获取路径字符串。例如...

    java中File的相对路径与绝对路径总结

    通过以上分析可以看出,在Java中处理文件路径时,根据不同的应用场景选择合适的路径表示方式非常重要。无论是相对路径还是绝对路径,都需要结合具体的项目结构和文件存储位置进行合理的设置。此外,还需要注意不同...

    java读取资源文件

    - 使用`Class.getResource()`或`Class.getResourceAsStream()`方法: - `getResource()`返回一个`URL`对象,适合处理网络或磁盘上的资源。 - `getResourceAsStream()`返回一个`InputStream`,适用于读取二进制...

    java文件路径操作详细[归类].pdf

    例如,`ClassLoader`类的`getResource(String name)`和`getResourceAsStream(String name)`方法,以及`ResourceBundle`类的`getBundle(String path)`都是基于此类路径查找资源。 然而,尽管相对路径在使用上更为...

    关于读取Src下配置文件的那个传说

    它们可以帮助开发者在不同操作系统上统一处理文件路径。 博客可能还涵盖了以下主题: - **错误处理**:如何处理配置文件不存在或格式错误的情况。 - **版本控制**:配置文件是否应包含在版本控制中,以及如何处理...

    java项目中获取路径详解

    使用 `getResource` 方法可以获取相对路径,使用 `getRealPath()` 方法可以获取绝对路径。ClassPath 路径是 Java 项目中的一个重要概念,使用它可以 guarantee 项目在开发和发布时的正确运行。在 Java Web 项目中,...

    java类动态获取相对路径

    `ClassLoader`提供了`getResource`和`getResourceAsStream`方法来获取资源的URL或输入流。例如,如果我们有一个名为`res.txt`的文件与`MyClass`同级,可以这样获取其URL: ```java URL resourceUrl = classLoader...

    关于java 读取eclipse下文件相对路径 关于Java的文件相对路径问题一直 ....doc

    在Eclipse中,为了保证代码在其他环境中也能正常工作,建议使用绝对路径或者基于类加载器的资源获取方式(如`ClassLoader.getResource()`或`ClassLoader.getResourceAsStream()`),而不是依赖于工作空间的相对路径...

    SpringBoot如何读取war包jar包和Resource资源

    2. getResource() 和 getResourceAsStream() 的区别 在读取资源文件时,通常使用 getResource() 或 getResourceAsStream() 方法。两种方法都可以读取资源文件,但是它们的使用场景和返回值不同。 getResource() ...

    读取jar文件

    - **方法**:类加载器提供了`getResource`和`getResourceAsStream`等方法用于查找和读取资源。 2. **资源文件的路径表示**: - 在jar包内部,资源文件的路径通常是以`/`开头的相对路径表示。例如,如果资源文件...

    getResourceAsStream

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

    读取properties文件路径的两种方式.zip

    本篇将详细讲解两种读取`properties`文件路径的方法,并通过一个项目示例进行演示。 方法一:使用`java.util.Properties`类 1. 首先,我们需要创建一个`properties`文件,例如命名为`config.properties`,并将它...

    java读取项目中的文件(src目录下)

    使用`getResource()`或`getResourceAsStream()`方法能更好地适应这些变化。 7. **异常处理**: - 在尝试读取文件时,应该始终处理可能出现的异常,如`FileNotFoundException`,确保程序在文件不存在或无法访问时...

    文件写入,项目相对路径,java反射,模板数据写入

    在Java应用中,我们经常需要获取资源文件的位置,这时可以使用`Class.getResource()`或`Class.getResourceAsStream()`方法,它们能够根据类加载器解析相对于类路径的路径。例如,如果你有一个名为`config.properties...

Global site tag (gtag.js) - Google Analytics