用ClassLoader获取资源

最近在写Servlet的时候,看到之前的代码里都是这样写的:

InputStream is = xxx.class.getResourceAsStream(filePath);

但是我用另一种写法:

ClassLoader.getSystemResourceAsStream(filePath);

在本地测试的时候也是行得通的,于是把Servlet扔到服务器上,但是到了服务器上,第二种写法就跑不通了。今天找到了下面这个文章:

ClassLoader.getSystemResourceAsStream and this.getClass().getClassLoader().getResourceAsStream()

ClassLoader.getSystemResourceAsStream uses the system ClassLoader (ClassLoader.getSystemClassLoader) to search for the resource.
this.getClass().getClassLoader().getResourceAsStream() uses the same ClassLoader that loaded the class for "this" Object. That ClassLoader might be a child of the system ClassLoader, and thus could have access to resources the system ClassLoader does not have. But since it is a child of the System ClassLoader, it also will ask its parent (System) to help it find resources. So using this method will allow you to find things in that ClassLoader AND in the System ClassLoader.
The search order is defined in the javadoc for ClassLoader.getResource (parent(s) first, then child).
For example, say you were running some code from a Servlet. The System ClassLoader contains whatever you put in CLASSPATH when you started the Web Server, but the servlet class is probably loaded by another ClassLoader that the server created to handle the WebApp‘s WEB-INF/lib and WEB-INF/classes directories. Things in those directories would be accessible using that WebApp‘s ClassLoader, but would not be in CLASSPATH - so the System ClassLoader does not know about them.
I‘m not sure I explained that well - hope it helps.

So if you want to get properties from a static method, it‘s better to use:
SomeClass.class.getClassLoader().getResourceAsStream("XX.properties"));

文章的地址:http://yaodong.yu.blog.163.com/blog/static/121426690200961282221588/

时间: 2024-12-08 00:27:31

用ClassLoader获取资源的相关文章

根据ClassLoader获取资源文件

private void display() { String path=this.getClass().getResource("").getPath(); System.out.println(path); path=this.getClass().getResource("/loadresource").getPath(); System.out.println(path); path=this.getClass().getResource("/lo

Class和ClassLoader.getResource获取资源

资源就是系统内.项目内的各种文件.在Java中获取可以用File类和Class.getResource获取资源,直观的说,File是依赖于文件系统和操作系统的,通过相对和绝对路径定位,使用File接口可以用于获取系统内任何路径下的普通文件.Class和ClassLoader可以用于获取项目环境中的资源,'环境中'的具体定义就是classpath.classpath相当于getResource参数的跟目录,ClassLoader.getResource是只能从这个根目录开始定位资源,Class.g

class getResourceAsStream 和 classloader getResourceAsStream获取资源的不同

工程目录结构: prj(工程根目录) cn json classloader GetResourceByClassAndClassLoader.Java beans.xml /** * */ package cn.json.classloader; import java.io.InputStream; /** * @author json * * @date 2014-5-7 * * @version 1.0 */ public class GetResourceByClassAndClass

Java中获取资源文件的方法总结

这里总结3中方法获取资源文件的 ServletContext Class ClassLoader 文件的位置 1. ServletContext public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter pw = response.getWriter(); ServletContext context

cocos2d-x学习笔记(七)利用curl获取资源包的大小

cocos2d-x将curl作为第三方库加进来,所以我们可以很方便的使用它. 最近在研究资源热更新,由于想在用户更新之前提示资源包大小,让用户知道此次更新所需消耗流量,所以在资源热更新AssetsManager类的基础上加入获取资源包大小的代码. 我用的是cocos2d-x 3.4的版本,AssetsManager源文件在cocos2d\extensions\assets-manager目录下. 一.首先在AssetsManager.h文件class AssetsManager底下加入代码 do

Android中通过反射获取资源Id

在将自己写的工具打成.jar包的时候,有时候会需要引用到res中的资源,这时候不能将资源一起打包,只能通过反射机制动态的获取资源. 特别用在自己定义一个工具将其打成.jar包时,特别注意资源的获取 1.封装成一个工具类  package com.cp.utils; import android.content.Context; public class CPResourceUtil { public static int getLayoutId(Context paramContext, Str

获取资源路径

一.web项目获取资源路径很简单 1.例如jsp中获取路径的写法如下: 1 <% 2 String path = request.getContextPath(); 3 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 4 %> 2.bean中获取路径的写法如下: 1 Str

&lt;Android&gt;关于获取资源文件R中的数据

通常我们都会使用context.getResources().getIdentifier(name, type,context.getPackageName())的方法去获取R.java中的数据. type--R其中的内部类名,如"drawable","string","color","dimen","layout"等,这也是我们常用的关于界面所需要获取的数据类型. name--R内部类中的static变量

Spring Resource接口获取资源

本文转自http://elim.iteye.com/blog/2016305 感谢作者 Resource 所有的资源都被可以通过 InputStream 这个类来获取,所以也屏蔽了资源的提供者 ResourceLoader 接口负责资源的统一加载 通过Spring Resource接口获取资源 目录 1       Resource简介 2       通过ResourceLoader获取资源 3       在bean中获取Resource的方式 1       Resource简介 在Spr