Java资源加载详解

标签: java 资源 加载 | 发表时间:2014-02-05 11:18 | 作者:kkcheng
出处:http://www.iteye.com
Java资源加载详解

Java开发中常常要加载各种各样的资源文件,如property文件,xml配置文件,图片文件等等。

Java的资源加载策略选择比较多,很多资源加载方法都是基于不同的项目配置,没有一种资

源加载方法是万能的。首先来看看Java中的几种常见的资源加载方法:



一:通过ResourceBundle类来实现资源加载

这种方式通常被用来加载多语言支持的property文件,Java语言通过ResourceBundle可以非

常好的支持国际化。假设在默认为英文的系统中有语言资源文件mybundle_en.properties,则

调用代码如下:

ResourceBundle myBundle =ResourceBundle.getBundle("mybundle");

资源文件mybundle_en.properties的位置应该在sourcefolder的根目录下,假如资源文件位于

包路径com.mybundle.test下则上述代码应该改写为:

ResourceBundle myBundle =ResourceBundle.getBundle("com.mybundle.test.mybundle");



二:通过Class类的getResourceAsStream()方法来实现资源加载

这种加载方式同时是最常用也是最容易让开发者搞错的方法,getResourceAsStream()方法使用

默认文件名加载资源时,要求资源必须与Class文件同时相同的包路径。加载代码如下:

client.getClass().getResourceAsStream("mybundle.properties");



三:通过ClassLoader的getResourceAsStream()来实现资源文件加载

通过ClassLoader来加载资源文件是一种非常有效和实用的方法,只要资源位于classpath的路

径下面,ClassLoader都可以通过适当的策略来找到你要加载的资源。但是应该注意的是如果你

的资源位于SourceFloder的根目录,如下代码就可以完成:

this.getClass().getClassLoader().getResource("mybundle.properties");

如果你的资源文件位于独立的config文件中,只需要把config配置到classpath的变量中,然后使

用如下代码即可:

this.getClass().getClassLoader().getResource("config/mybundle.properties");



三种资源加载方式比较与总结:

方法


参数


失败时行为


用法示例代码

ClassLoader.

getResourceAsStream()


绝对路径加载时候不需要反斜杠/


Silent (return null)


This.getCalss().

getClassLoader().

getResourceAsStream(“

some/pkg/resource.prpperties

”);

Class.

getResourceAsStream()


有反斜杠/表现为绝对路径


Silent(return null)


This.getClass().

getResourceAsStream(“

resource.properties”);

ResourceBundle.

getBundle()


不需要反斜杠/, .已经暗示绝对路径

.properties为其默认的文件扩展名


Throws unchecked

java.util.MissingResource

Exception


ResourceBundle.getBundle(

“some.pkg.resource”)

资源加载策略说明:

不同的开发者对资源文件的管理千差万别,有的喜欢把它们放在不同的类路径下面,有的喜

欢放在单一的config文件下,没有一种方法是错误的。但是为了能够正确的加载到你需要的

资源文件,永远应该记得把资源文件夹的路径配置做为classpath的一部分,如果资源文件没

有位于你的source folder之内。否则你不得不通过额外的手段来配置与加载你的资源文件。

基于上述的总结,完成了一个资源加载的UtilityClass, 让你从此不再对Java中资源加载怀有好奇

与恐惧之心。

Resource Loading Utility Class源代码如下:

[java] view plaincopy

    import java.io.InputStream; 
    import java.util.Locale; 
    import java.util.Properties; 
    import java.util.ResourceBundle; 
     
    public class CommonResourceLoader { 
     
            /**
             * please use this method if property files located at same package with CommonResourceLoader
             * Java class
             * 
             * @param PropertiesName
             * @return
             */ 
            public static Properties loadPropertyFile(String PropertiesName) { 
     
                  Properties props = new Properties(); 
     
                  try 
                  { 
                      InputStream in = CommonResourceLoader.class.getResourceAsStream(PropertiesName); 
                     if (in != null) 
                     { 
                        props.load(in); 
                     }  
                     else 
                     { 
                        throw new IllegalArgumentException("No file exists for" + PropertiesName); 
                     } 
                  } 
                  catch (Exception e) 
                  { 
                     e.printStackTrace(); 
                  } 
     
                  return props; 
            } 
             
            /**
             * if the properties file is located at obj's package, please use it
             * @param obj
             * @param PropertiesName
             * @return
             */ 
            public static Properties loadPropertyFile(Class obj,  String PropertiesName) { 
     
                  Properties props = new Properties(); 
     
                  try 
                  { 
                      InputStream in = obj.getResourceAsStream(PropertiesName); 
                     if (in != null) 
                     { 
                        props.load(in); 
                     }  
                     else 
                     { 
                        throw new IllegalArgumentException("No file exists for" + PropertiesName); 
                     } 
                  } 
                  catch (Exception e) 
                  { 
                     e.printStackTrace(); 
                  } 
     
                  return props; 
            } 
             
            /**
             * base name is file name if file located at class path root directory
             * base name is directory + file full name if file at some folder inside class path list.
             * eg: myPro.properties
             * project structure
             * pro--src
             *  |    |---com.mytest.pkg
             *  |    |               |-----Hello.java
             *  |    |               |-----test.properties
             *  |---myPro.properties
             *  baseName= com/mytest/pkg/test.properties if load test.properties
             *  baseName= myPro.properties if load myPro.properties
             *
             * @param baseName
             * @return
             */ 
            public static Properties loadCurrentPropertyFile(String baseName) { 
                Properties props = new Properties(); 
     
                try 
                { 
                    InputStream in = CommonResourceLoader.class.getClassLoader().getResourceAsStream(baseName); 
                   if (in != null) 
                   { 
                      props.load(in); 
                   }  
                   else 
                   { 
                      throw new IllegalArgumentException("No file exists for" + baseName); 
                   } 
                } 
                catch (Exception e) 
                { 
                   e.printStackTrace(); 
                } 
     
                return props; 
            } 
             
            public static Properties loadSystemPropertyFile(String name, ClassLoader loader) { 
                Properties props = new Properties(); 
     
                try 
                { 
                    if(loader == null) 
                        loader = ClassLoader.getSystemClassLoader(); 
                    InputStream in = loader.getResourceAsStream(name); 
                   if (in != null) 
                   { 
                      props.load(in); 
                   }  
                   else 
                   { 
                      throw new IllegalArgumentException("No file exists for" + name); 
                   } 
                } 
                catch (Exception e) 
                { 
                   e.printStackTrace(); 
                } 
     
                return props; 
            } 
             
            /**
             * resourceURL is file name if file located at class path root directory
             * resourceURL is directory + file full name if file at some folder inside class path list.
             * eg: myPro.properties
             * project structure
             * pro--src
             *  |    |---com.mytest.pkg
             *  |    |               |-----Hello.java
             *  |    |               |-----test.properties
             *  |---myPro.properties
             *  resourceURL= com.mytest.pkg.test.properties if load test.properties
             *  resourceURL= myPro.properties if load myPro.properties
             *
             * @param baseName
             * @return
             */ 
            public static ResourceBundle loadResourceBundle(String resourceURL) { 
     
                    Locale locale = Locale.ENGLISH; 
                    ResourceBundle bundle = null; 
     
                    try { 
                            bundle = ResourceBundle.getBundle(resourceURL, locale); 
                            if (bundle == null) { 
                                    throw new IllegalArgumentException("No file exists for" + resourceURL); 
                            } 
                    } catch (Exception e) { 
                            e.printStackTrace(); 
                    } 
     
                    return bundle; 
            } 
     
    } 

特别说明:

这里的资源是指配置文件(xml,property等), 图片,Java程序运行需要的一切文本文件等等。

已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [java 资源 加载] 推荐:

Java资源加载详解

- - 企业架构 - ITeye博客
Java开发中常常要加载各种各样的资源文件,如property文件,xml配置文件,图片文件等等. Java的资源加载策略选择比较多,很多资源加载方法都是基于不同的项目配置,没有一种资. 首先来看看Java中的几种常见的资源加载方法:. 一:通过ResourceBundle类来实现资源加载. 这种方式通常被用来加载多语言支持的property文件,Java语言通过ResourceBundle可以非.

java动态加载

- - Java - 编程语言 - ITeye博客
第一部分:Java虚拟机启动时,关于类加载方面的一些动作. 当使用java ProgramName.class运行程序时,Java找到JRE,接着找到jvm.dll,把该动态库载入内存,这就是JVM. 然后加载其它动态库, 并激活JVM. JVM激活之后会进行一些初始化工作,之后生成BootstrapLoader,该Class Loader是由C++写的.

JAVA Web.xml 加载顺序

- - 企业架构 - ITeye博客
web.xml加载过程(步骤):.        1.启动WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml.读两个节点:   .    . 2.紧接着,容器创建一个ServletContext(上下文),这个WEB项目所有部分都将共享这个上下文..

JAVA 动态(手动)加载jar文件

- - CSDN博客编程语言推荐文章
//filePath 是jar的绝对路径. //里面是一个url的数组,可以同时加载多个. //根据类名加载指定类,例:. //通过反射调用类中的方法,例如调用addFile方法,有1个String参数和一个int参数:. 如果有返回值,则直接返回需要的值,例:. 作者:kingboy123000 发表于2013-10-23 16:12:30 原文链接.

Java虚拟机类加载机制

- - CSDN博客编程语言推荐文章
本文是《深入理解Java虚拟机》第七章的读书总结. Class文件中存储了类(或接口)中的元数据信息和编译后的字节码. 这些信息需要存入Java虚拟机中才能被虚拟机利用和执行. 而Class文件是需要Java虚拟机加载到虚拟机内存中的. 这就涉及到几个问题,什么时候需要加在一个Class文件. 虚拟机如何加载Class文件到虚拟机内存中.

yepnope.js – 异步加载资源文件

- Allen - 某人的栖息地
yepnope.js是一个能够根据输入条件来选择性异步加载资源文件的js脚本,可以在页面上仅加载用户需要的js/css. 当Modernizr.geolocation为真时,加载yep项也就是”normal.js”,否则加载nope项——可以同时加载多个文件. yepnope和现有的xxx script loader有什么区别.

转 JAVA读取外部资源的方法

- - Java - 编程语言 - ITeye博客
在java代码中经常有读取外部资源的要求:如配置文件等等,通常会把配置文件放在classpath下或者在web项目中放在web-inf下. 1.从当前的工作目录中读取:. 2,从classpath中读取(读取找到的第一个符合名称的文件):. 3,从classpath中读取(读取找到的所有符合名称的文件,如Spring中带有classpath*:前缀的情况就会从classpath中遍历):.

java在访问https资源时,忽略证书信任问题

- - CSDN博客推荐文章
java程序在访问https资源时,出现报错. 这本质上,是java在访问https资源时的证书信任问题. 客户端在使用HTTPS方式与Web服务器通信时有以下几个步骤,如图所示. (1)客户使用https的URL访问Web服务器,要求与Web服务器建立SSL连接. (2)Web服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端.

推荐!国外程序员整理的Java资源大全

- - ImportNew
这里搜集了用来构建应用程序的工具. Apache Maven:Maven使用声明进行构建并进行依赖管理,偏向于使用约定而不是配置进行构建. Maven优于Apache Ant. 后者采用了一种过程化的方式进行配置,所以维护起来相当困难. Gradle:Gradle采用增量构建. Gradle通过Groovy编程而不是传统的XML声明进行配置.

Java 程序的编译,加载 和 执行

- Ben - 弯曲评论
[ 在这个 slides 里边, 莫枢 (Kris Mok) 介绍了 java & java run-time system 的结构. Managed language 提供了更高一级的抽象,提高了程序员的生产力,但是从 application code 到  ISA 的中间层也更厚,比如程序员非常容易把C代码对应到优化后的汇编,但是判断出java 程序对应的汇编就相对难一些.