一,简介
在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中获取文件路径的各种方法及其应用场景,帮助开发者更好地理解和掌握这些技巧。 #### 二、基本概念 在深入讨论之前,我们需要了解几个基本概念: - **Classpath**: 是Java运行环境的一个重要...
### JAVA中如何获取文件路径详解 #### 一、概述 在Java编程中,获取文件路径是一项基础而重要的技能。无论是处理本地文件还是部署在Web容器中的应用,了解如何正确地获取文件路径对于程序的正常运行至关重要。本文...
2. `getResource()`和`getResourceAsStream()`:这两个方法用于获取URL资源和对应的输入流。如果你只想读取文件内容,而不需要文件系统路径,可以使用它们。例如: ```java ServletContext context = ...
本篇文章将详细探讨Java提供的两种主要方法:`Class.getResource`和`Class.getResourceAsStream`,用于加载类路径下的资源文件。 首先,`Class.getResource`方法返回一个`URL`对象,它表示资源的位置。这个方法接受...
Java 文件路径详解是 Java 中获取文件路径的方式,包括 Class.getResourceAsStream() 和 ClassLoader.getResourceAsStream() 两种方法。这些方法可以帮助开发者快速获取文件路径,以便于读取文件的内容。
当你需要获取与类相关的资源文件的绝对路径时,可以使用 `Class.getResource()` 或 `Class.getResourceAsStream()` 方法。这些方法返回一个 `java.net.URL` 对象,可以通过调用 `getPath()` 来获取路径字符串。例如...
通过以上分析可以看出,在Java中处理文件路径时,根据不同的应用场景选择合适的路径表示方式非常重要。无论是相对路径还是绝对路径,都需要结合具体的项目结构和文件存储位置进行合理的设置。此外,还需要注意不同...
- 使用`Class.getResource()`或`Class.getResourceAsStream()`方法: - `getResource()`返回一个`URL`对象,适合处理网络或磁盘上的资源。 - `getResourceAsStream()`返回一个`InputStream`,适用于读取二进制...
例如,`ClassLoader`类的`getResource(String name)`和`getResourceAsStream(String name)`方法,以及`ResourceBundle`类的`getBundle(String path)`都是基于此类路径查找资源。 然而,尽管相对路径在使用上更为...
它们可以帮助开发者在不同操作系统上统一处理文件路径。 博客可能还涵盖了以下主题: - **错误处理**:如何处理配置文件不存在或格式错误的情况。 - **版本控制**:配置文件是否应包含在版本控制中,以及如何处理...
使用 `getResource` 方法可以获取相对路径,使用 `getRealPath()` 方法可以获取绝对路径。ClassPath 路径是 Java 项目中的一个重要概念,使用它可以 guarantee 项目在开发和发布时的正确运行。在 Java Web 项目中,...
`ClassLoader`提供了`getResource`和`getResourceAsStream`方法来获取资源的URL或输入流。例如,如果我们有一个名为`res.txt`的文件与`MyClass`同级,可以这样获取其URL: ```java URL resourceUrl = classLoader...
在Eclipse中,为了保证代码在其他环境中也能正常工作,建议使用绝对路径或者基于类加载器的资源获取方式(如`ClassLoader.getResource()`或`ClassLoader.getResourceAsStream()`),而不是依赖于工作空间的相对路径...
2. getResource() 和 getResourceAsStream() 的区别 在读取资源文件时,通常使用 getResource() 或 getResourceAsStream() 方法。两种方法都可以读取资源文件,但是它们的使用场景和返回值不同。 getResource() ...
- **方法**:类加载器提供了`getResource`和`getResourceAsStream`等方法用于查找和读取资源。 2. **资源文件的路径表示**: - 在jar包内部,资源文件的路径通常是以`/`开头的相对路径表示。例如,如果资源文件...
java getResourceAsStream种类,分我所知道的3种情况
本篇将详细讲解两种读取`properties`文件路径的方法,并通过一个项目示例进行演示。 方法一:使用`java.util.Properties`类 1. 首先,我们需要创建一个`properties`文件,例如命名为`config.properties`,并将它...
使用`getResource()`或`getResourceAsStream()`方法能更好地适应这些变化。 7. **异常处理**: - 在尝试读取文件时,应该始终处理可能出现的异常,如`FileNotFoundException`,确保程序在文件不存在或无法访问时...
在Java应用中,我们经常需要获取资源文件的位置,这时可以使用`Class.getResource()`或`Class.getResourceAsStream()`方法,它们能够根据类加载器解析相对于类路径的路径。例如,如果你有一个名为`config.properties...