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

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

一、用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方法来加载,其实这个方法也是调用的加载这个类的类加载器来获得资源文件的,只不过是获取的参数不同。

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

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

其实第二种方式是对第一种方式的一个封装,都是用的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的加载路径。

时间: 2024-11-16 14:51:39

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

Java加载资源文件的两种方法

处理配置文件对于Java程序员来说再常见不过了,不管是Servlet,Spring,抑或是Structs,都需要与配置文件打交道.Java将配置文件当作一种资源(resource)来处理,并且提供了两个类来读取这些资源,一个是Class类,另一个是ClassLoader类.     当我们自己的程序需要处理配置文件时(比如xml文件或properties文件),通常会遇到两个问题:   (1)我的配置文件应该放在哪里? (2)怎么我的配置文件找不到了?     在了解了Java加载资源文件的机制

relativelayout-定义一个类继承RelativeLayout在用inflater加载布局文件时为什么找不到?

问题描述 定义一个类继承RelativeLayout在用inflater加载布局文件时为什么找不到? 解决方案 http://www.oschina.net/question/657381_122348 解决方案二: 是不是import的R路径不对啊

请问,如何将网页文件放到资源文件的包里,然后用webbrowser加载资源文件包里的网页?

问题描述 我想将网页文件放到资源文件的包里,然后再用webbrowser加载资源文件包里的此网页,具体怎么实现,帮帮忙吧,万分感激 解决方案 解决方案二:没做过有一些资料,看看能不能帮你:加载的本地资源有两种情况:一:加载程序集里面的资源信息 1.加载html资源 (1) StreamReaderreader=Application.GetResourceStream(NewUri("path",UriKind.Relative).Stream; webBrowser.Navigate

ios webview加载本地文件时崩溃

问题描述 ios webview加载本地文件时崩溃 加载本地一个docx格式的文件,程序崩溃,exc_bad_access 完全没有异常信息 解决方案 http://www.lxway.com/884821684.htm 解决方案二: 至少要上一下给我们代码看看嘛 解决方案三: iOS webView 加载文件 及 文件操作iOS中webview加载本地html文件iOS webview 加载html 乱码

动态加载资源文件(ResourceDictionary)

原文:动态加载资源文件(ResourceDictionary) 在xaml中控件通过绑定静态资源StaticResource来获取样式Style有多种方式:        1.在项目的启动文件App中<Application.Resources>里添加相应的样式内容,当然也可以在控件所在的控件的资源(如:<UserControl.Resources>)中添加相应样式内容        2.通过后台代码向当前程序的资源中动态添加,代码如下:(TextBlockStyle.xaml是一

浏览器管理加载项按钮变成灰色打不开解决办法

  对于一个能上网的电脑来说,浏览器是至关重要的.但是有用户反映工具菜单中的"管理加载项"按钮变成了灰色,导致点击管理加载项无反应打不开的问题,出现这种情况主要原因是win7 64位注册表被修改所致,小米,一起来看看浏览器管理加载项按钮变成灰色打不开解决办法. 解决方法/步骤: 1.打开"运行"之后,在里面输入"regedit"字符,然后回车打开注册表编辑器; 2.定位路径到: HKEY_LOCAL_MACHINESOFTWAREPolicies

yepnope.js 异步加载资源文件_javascript技巧

典型代码示例 复制代码 代码如下: yepnope({ test : Modernizr.geolocation, yep : 'normal.js', nope : ['polyfill.js', 'wrapper.js'] }); 当Modernizr.geolocation为真时,加载yep项也就是"normal.js",否则加载nope项--可以同时加载多个文件. yepnope和现有的xxx script loader有什么区别? 个人认为主要 是这两点: 可以同时处理jav

JSP加载JS文件不起作用的有效解决方法_JSP编程

目录结构:jsp导入jquery文件,老是不起作用,原因在于: 复制代码 代码如下: <script type="text/javascript" src="js/jquery-1.4.2.min.js"></script> 其不能访问/WEB-INF/目录下的文件,因此需要将加载的js文件其放倒webapp目录.  test.html: 复制代码 代码如下: <%@ page language="java" %&g

YARN加载本地库Unable to load native-hadoop library解决办法

用官方的构建好的Hadoop 2.4.0(133MB)安装后,每次输入hadoop命令进去都会得到这样一个Warning,如图: WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable 网上搜罗了一些资料,下面是解决办法: 设置logger级别,看下具体原因: ? 1 export HADOOP