`
xinglongbing
  • 浏览: 152551 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Java中一个关于资源定位的问题

阅读更多

假若将图像文件跟类文件等都打包到同一个Jar文件中,我们应该如何定位其中涉及的图像资源文件呢?

在程序中仅仅使用相对路径可能是不正确的。其中的关键问题涉及如何类和方法:

Class类中的getResource方法

public URL getResource(String name)
Finds a resource with a given name. The rules for searching resources associated with a given class are implemented by the defining class loader of the class. This method delegates to this object's class loader. If this object was loaded by the bootstrap class loader, the method delegates to ClassLoader.getSystemResource(java.lang.String).

Before delegation, an absolute resource name is constructed from the given resource name using this algorithm:

  • If the name begins with a '/' ('\u002f'), then the absolute name of the resource is the portion of the name following the '/'.
  • Otherwise, the absolute name is of the following form:
       modified_package_name/name
     

    Where the modified_package_name is the package name of this object with '/' substituted for '.' ('\u002e').

 

Parameters:
name - name of the desired resource
Returns:
A URL object or null if no resource with this name is found
Since:
JDK1.1
这是JDK源码实现:
public java.net.URL getResource(String name) {
        name = resolveName(name);
        ClassLoader cl = getClassLoader0();
        if (cl==null) {
            // A system class.
            return ClassLoader.getSystemResource(name);
        }
        return cl.getResource(name);
    }

另一个是ClassLoader类的getResource方法:

public URL getResource(String name)
Finds the resource with the given name. A resource is some data (images, audio, text, etc) that can be accessed by class code in a way that is independent of the location of the code.

The name of a resource is a '/'-separated path name that identifies the resource.

This method will first search the parent class loader for the resource; if the parent is null the path of the class loader built-in to the virtual machine is searched. That failing, this method will invoke findResource(String) to find the resource.

 

Parameters:
name - The resource name
Returns:
A URL object for reading the resource, or null if the resource could not be found or the invoker doesn't have adequate privileges to get the resource.
Since:
1.1
这是JDK源码实现:
 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;
    }
 /**
     * Find a resource of the specified name from the search path used to load
     * classes.  This method locates the resource through the system class
     * loader (see {@link #getSystemClassLoader()}).  </p>
     *
     * @param  name
     *         The resource name
     *
     * @return  A {@link java.net.URL <tt>URL</tt>} object for reading the
     *          resource, or <tt>null</tt> if the resource could not be found
     *
     * @since  1.1
     */
    public static URL getSystemResource(String name) {
 ClassLoader system = getSystemClassLoader();
 if (system == null) {
     return getBootstrapResource(name);
 }
 return system.getResource(name);
    }



/**
     * Find resources from the VM's built-in classloader.
     */
    private static URL getBootstrapResource(String name) {
 URLClassPath ucp = getBootstrapClassPath();
 Resource res = ucp.getResource(name);
 return res != null ? res.getURL() : null;
    }
// Returns the URLClassPath that is used for finding system resources.
    static URLClassPath getBootstrapClassPath() {
 if (bootstrapClassPath == null) {
     bootstrapClassPath = sun.misc.Launcher.getBootstrapClassPath();
 }
 return bootstrapClassPath;
    }


/**
     * Finds the resource with the given name. Class loader implementations
     * should override this method to specify where to find resources.  </p>
     *
     * @param  name
     *         The resource name
     *
     * @return  A <tt>URL</tt> object for reading the resource, or
     *          <tt>null</tt> if the resource could not be found
     *
     * @since  1.2
     */
    protected URL findResource(String name) {
 return null;
    }
 

从JDK的解释看出:Class.getResource方法其实还是委托给ClassLoader.getResource方法去运行的。最终还是由本地方法去执行的。

分享到:
评论

相关推荐

    java百度定位

    Java 百度定位是Java开发中一种常见的地理位置服务技术,它允许开发者在应用程序中集成百度地图API,实现用户的实时定位、轨迹追踪等功能。在Java应用中集成百度定位服务,可以帮助我们构建各种基于位置的应用,如...

    用java代码实现的移除未使用资源。.zip

    `finalize()`方法是Java中一个特殊的方法,可以在对象被垃圾回收之前执行清理操作。但这种方法不推荐使用,因为其执行时间不确定且效率低下。相比之下,`PhantomReference`配合引用队列可以更精确地控制资源的释放...

    java入门基础课件

    接口也是Java中一个关键的抽象形式,它允许实现多个行为标准,增强了代码的灵活性和可扩展性。 文件操作是任何编程语言都不可或缺的部分,Java提供了丰富的类库来读写文件,如File类、InputStream和OutputStream。...

    Head First Java中文高清版

    7. 多线程编程:多线程是Java中一个非常重要的特性,书本会从创建线程、线程同步等基础概念讲起,然后逐渐深入到线程安全、线程池等高级话题。 8. 图形用户界面(GUI)编程:虽然现代开发中Web和移动端更为流行,但...

    基于MVC的Java资源管理器 v2.0.7z

    3. 功能增强:可能增加了对特定文件类型的预览支持,或者引入了新的搜索功能,以提高资源定位效率。 4. 兼容性:可能提升了对不同操作系统或文件系统的兼容性,使得该管理器能在更多环境中运行。 5. 安全性:可能...

    如何解决Java内存泄漏

    Java内存泄漏是软件开发中一个常见的问题,它不仅会影响应用程序的性能,还可能导致系统崩溃。通过深入了解Java的内存管理机制,并借助于专业的工具如OptimizeIt,可以有效地检测和解决内存泄漏问题。此外,开发者还...

    探究内存泄露-Part2-分析问题Java开发Java经验

    内存泄露是Java开发中一个非常重要的主题,尤其是在大型系统或者长时间运行的服务中,它可能导致系统性能下降,甚至最终导致服务崩溃。本部分我们将深入探讨内存泄露的分析方法和解决策略,分享一些Java开发中的实战...

    java 监控线程

    Java线程监控是Java开发中一个非常重要的环节,它能够帮助开发者分析程序的运行状态,定位性能瓶颈,预防和解决死锁等问题。本文将详细探讨Java中如何进行线程监控,包括基本概念、常用工具以及具体实践方法。 一、...

    Java证书打印工具类

    总的来说,"Java证书打印工具类"是Java开发中一个实用的辅助工具,通过封装复杂的打印逻辑,使得证书打印变得简单易行。开发者可以根据实际需求调整和扩展这个工具类,以满足各种不同的打印场景。

    JAVA程序员面试问题

    异常处理是Java中一个关键的概念,用于处理程序运行时可能出现的错误情况。Java使用try-catch-finally语句块来捕获和处理异常。在try块中放置可能抛出异常的代码,在catch块中捕获并处理特定类型的异常,finally块则...

    反编译工具java

    描述中提到的“此资源可用于Java开发中一部分.class文件反编译成java可读内容”,意味着这个资源包含了一个或多个反编译工具,可以将Java的类文件转换成人类可读的Java源代码。这对于调试、维护和学习第三方库尤其...

    JAVA常见面试题300道

    缺点是 Java 中一个类只能单继承,如果继承了 Thread 类,就无法再继承其他类。 - **实现 Runnable 接口**:灵活性更高,可以继承其他类。缺点是需要手动将 Runnable 对象传递给 Thread 对象。 - **使用 Executor ...

    【IT十八掌徐培成】Java基础第16天-01.RandomAccessFile.zip

    总之,`RandomAccessFile`是Java中一个强大的工具,它提供了灵活的文件访问能力,可以满足许多高级文件操作的需求。在学习Java基础的过程中,理解并掌握`RandomAccessFile`的用法对于提升编程技能和解决实际问题具有...

    JavaClassFinder(Java搜索工具)

    总之,JavaClassFinder是Java开发中一个非常实用的辅助工具,它的便捷性和高效性使其在众多开发者中受到青睐。通过熟练掌握和利用这类工具,可以显著提高开发效率,让Java后端开发变得更加轻松。

    411.409.JAVA基础教程_IDEA的使用与多线程-Module的理解和创建(411).rar

    而多线程则是Java中一个核心的并发编程概念,它允许程序同时执行多个任务,提高系统资源利用率,提升程序性能。 首先,让我们讨论IntelliJ IDEA的使用。IDEA提供了丰富的代码补全、代码分析和重构工具,帮助开发者...

    java经典编程题一及答案.pdf

    - Applet是Java中一种特殊的类,用于在支持Java的浏览器中运行的小应用程序。 - 它可以嵌入HTML页面中,通过`&lt;applet&gt;`标签进行调用。 - Applet能够处理用户的输入,并且可以和用户进行交互。 - 在Java的早期...

    Android 兼容性问题:java.lang.UnsupportedOperationException解决办法

    5. 使用Android Studio检查工具:Android Studio提供了一个检查工具,可以检查布局文件中的错误,帮助开发者快速定位问题。 总结 在 Android 开发中,java.lang.UnsupportedOperationException是一种常见的异常,...

    JAVA反编译器 XJad

    JAVA反编译器XJad是一款专用于Java字节码反编译的工具,它能够将已编译...总的来说,JAVA反编译器XJad是Java开发和逆向工程中一个实用的工具,它提供了从字节码到源代码的转换功能,帮助我们更好地理解和操作Java程序。

Global site tag (gtag.js) - Google Analytics