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方法去运行的。最终还是由本地方法去执行的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值