Java加载资源文件时的路径问题的解决办法

2016-02-19 10:11 6 1 收藏

下面图老师小编要跟大家分享Java加载资源文件时的路径问题的解决办法,简单的过程中其实暗藏玄机,还是要细心学习,喜欢还请记得收藏哦!

【 tulaoshi.com - 编程语言 】

加载资源文件比较常用的有两种:

一、用ClassLoader,说到这里就不得不提一下ClassLoader的分类,java内置的ClassLoader主要有三种,

第一种是根类加载器(bootstrap class loader),用C++来编写,负责将一些关键的Java类,如java.lang.Object和其他一些运行时代码先加载进内存中。 所负责加载的包:BootStrp------JRE/lib/rt.jar

第二种是扩展类加载器(ExtClassLoader),由java类编写,负责将JRE中的一些类加载进内存中。所负责加载的包: ExtClassLoader----------JRE/lib/ext/*.jar

第三种是应用类加载器(AppClassLoader)或者叫做系统类加载器,负责将CLASSPATH中的类加载到内存中。可以通过ClassLoader.getSystemClassLoader()来获取应用类加载器;

再来所说加类载器的继承,类加载器不是垂直继承的父子关系,而是一种组合关系,可以通过实例化类加载器时,将父类加载器的实例作为构造参数传到类加载器中。

关于类加载器的详细资料,可以自行搜索。
 

获取到应用类加载器之后,就是获取资源文件了,调用loader.getResource(path)可以加载相应路径下的资源文件,不能以‘/'开头,关于包内的资源可以把包当做普通的文件夹,以'/'分隔每个包。

如:URL url2 =  ClassLoader.getSystemClassLoader().getResource("demo/names.ser");是获取demo包内的names.ser序列化文件。

二、用需要加载的当前类的getResource方法来加载,其实这个方法也是调用的加载这个类的类加载器来获得资源文件的,只不过是获取的参数不同。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

 (1)要想获取class所在包内的文件可以用相对路径直接访问包内的资源;如:Demo1.class.getResource("names.ser");获取的是Demo1的class文件所在包内的资源

 (2)要想获取包外的资源文件必须以‘/'开头,如URL url = Demo1.class.getResource("/demo/names.ser");获取的是demo包内的names.ser文件

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

其实第二种方式是对第一种方式的一个封装,都是用的ClassLoader来加载的资源文件。为什么这么说呢?看一下Class类的源码就知道:
代码如下:

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);
     }

代码如下:

private String resolveName(String name) {
         if (name == null) {
             return name;
         }
         if (!name.startsWith("/")) {
             Class c = this;
             while (c.isArray()) {
                 c = c.getComponentType();
             }
             String baseName = c.getName();
             int index = baseName.lastIndexOf('.');
             if (index != -1) {
                 name = baseName.substring(0, index).replace('.', '/')
                     +"/"+name;
             }
         } else {
             name = name.substring(1);
         }
         return name;
     }

getResource根据传进来的name值(即相对路径或者绝对路径的形式),我们看到经过resolveName处理之后就调用了ClassLoader c1进行了加载,ClassLoader的加载路径的形式是不以‘/'开头的相对路径,那肯定是resolveName把路径转换了一把,再看看resolveName方法,首先判断是不是以‘/'开头,如果以‘/'开头,则为相对路径,否则就是绝对路径,注意else这个代码块,它将第一个字符去除掉了,确实去除掉之后就符合了ClassLoader的加载路径,而if块中就根据把当前类的包路径截取,然后将.替换成了'/',并添加上那段相对路径,也形成了符合ClassLoader的加载路径。

来源:http://www.tulaoshi.com/n/20160219/1593734.html

延伸阅读
标签: 电脑入门
有很多朋友都感觉使用QQ上网时,程序运行一段时间后电脑就变得很缓慢,用任务管理器查看进程发现CPU的占有率很高,也不是电脑中毒的问题。 其实,造成这种QQ占用CPU资源过高的情况可能和你的QQ软件的设置有关系,通过修改QQ的设置就可以解决问题。 1、降低qq群频繁弹出信息,将一些不经常使用的QQ群的自动弹出的聊天信息屏蔽,...
标签: PHP
        问题描述:       在使用PHP和JAVA操作XML-RPC的时候,如果request中包含中文字符,会被自动编码成如下样式: 欢欢 。       环境:PHP内置XML-RPC的API,Apache的XML-RPC的JAVA API       PHP下的解决方法:  &n...
《钢铁雄心3》存档问题的解决办法 官网看到的方法,目前可能导致读档失败原因 1. 记忆体不足 2. 存档中的Sunk Ship列表,这里面有包含游戏开始到存档时所有被击沈的船只记录。问题出在航空母舰和舰载机的部分,只要把读取存档找到sunk_ships={},{}中是所有被击沈的船只资料,将其中的carrier资料删除或是将所有击沈船只纪录删除即可。 &nb...
本文介绍如何在VC资源文件中加入自己的声音资源,使自己的应用程序可以播放声音。 1、首先用文本编辑器(如记事本)打开资源文件(.rc文件) 在最后加入自己的声音资源,如下IDW WAVE "c:\\kav\\sound\\virus.wav" 保存资源文件。 2、在应用程序中要播放声音的地方启动另一线程,用来播放声音: AfxBeginThread((AFX_T...
标签: 电脑入门
路由器掉线很可能并非它自身的原因,在责怪路由前,您需要确认您的网络环境是否正常  .将一台电脑直接通过猫或者小区宽带口连好,此时如果不可上网也不可打电话的话一般就是电话线绝缘不良或有接头接触不良,我们可以自己仔细检查线路将有破损的地方用绝缘胶布贴好或者直接报运营商要求上门维修  .如果可打电话不可上网可能是互联网...

经验教程

957

收藏

97
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部