`
kkcheng
  • 浏览: 39850 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

Java资源加载详解

 
阅读更多
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程序运行需要的一切文本文件等等。
分享到:
评论

相关推荐

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会java语言的读者快速地从java基础知识的学习中过渡到java web的学习与开发上. 第1部分 xml篇. 第1章 xml...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会java语言的读者快速地从java基础知识的学习中过渡到java web的学习与开发上. 第1部分 xml篇. 第1章 xml...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会java语言的读者快速地从java基础知识的学习中过渡到java web的学习与开发上. 第1部分 xml篇. 第1章 xml...

    深入理解java类加载机制

    本资源主要介绍了Java字节码和类加载的详细过程。字节码是Java程序在编译之后的中间代码表现形式。而类加载是Java程序执行过程中的一个重要的组成部分,它实现了程序的动态加载和运行。 在字节码方面,我们将从Java...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part5

    此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会java语言的读者快速地从java基础知识的学习中过渡到java web的学习与开发上. 第1部分 xml篇. 第1章 xml...

    classloader类加载器_基于java类的加载方式详解

    下面小编就为大家带来一篇classloader类加载器_基于java类的加载方式详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Java加载properties文件实现方式详解

    主要介绍了Java加载properties文件实现方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    JAVA高并发高性能高可用高扩展架构视频教程

    JAVANIO原理详解 高并发数据库(Mysql数据库性能优化) 软件质量管控 企业常用框架springMVC基于注解+xml配置方式实现链接 WEB服务器优化之Tomcat7性能调优 JVM概述 Java开发技术之(项目工程的日志管理) 数据库连接池...

    SpringBoot (4.71G)精华详解

    11.Spring的Bean加载流程与缓存过程详解.mp4 12.Spring的Bean获取流程深入解读.mp4 13.Spring的Bean创建策略分析.mp4 14.Spring单例Bean的初始化与缓存流程详解.mp4%U7X2[;{3z 15.Spring对象属性赋值与作用域源码解

    疯狂JAVA讲义

    第1章 Java概述 1 1.1 Java语言的发展简史 2 1.2 Java的竞争对手及各自优势 4 1.2.1 C#简介和优势 4 1.2.2 Ruby简介和优势 4 1.2.3 Python的简介和优势 5 1.3 Java程序运行机制 5 1.3.1 高级语言的运行机制 6...

    JAVA核心知识点整理(有效)

    25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................

    TCPIP协议详解(4-1)

    名字服务器 48 6.1 域名系统概述 48 6.2 授权局 50 6.3 DNS分布数据库 50 6.4 域和区 50 6.5 Internet顶级域 51 6.6 选择一个... 6.10 DNS安全 52 6.11 资源记录 53 6.12 小结 54 第7章...

    J2EE应用开发详解

    17 2.1 构建开发环境 17 2.1.1 安装JDK 17 2.1.2 安装Tomcat 21 2.1.3 安装Eclipse 23 2.2 配置开发环境 23 2.3 小结 26 第3章 Java的反射机制 27 3.1 Java反射API 27 3.2 加载类的实例 29 3.2.1 加载class对象的两...

    JAVA面试题 static关键字详解

    static 修饰的资源属于类级别,是全体对象实例共享的资源; 使用 static 修饰的属性,静态属性是在类的加载期间初始化的,使用类名.属性访问 案例说明 ①修饰成员变量 package com.ant.param; public class Static...

    Java日志框架:logback详解

    大约从16年中到现在,不管是我参与的别人已经搭建好的项目还是我自己主导的项目,日志框架基本都换成了logback,总结一下,logback大约有以下的一些优点:内核重写、测试充分、初始化内存加载更小,这一切让logback...

    java中JVM(学习资料)

    学习资料包括JVM简介、作用和特征、工作原理、执行原理、原理结构、类加载原理详解等

    Android开发应用实战详解源代码

    5.12.2 java i/o基本类库介绍 5.12.3 具体实现 5.13 获取file和cache的路径 5.14 wi-fi服务 5.14.1 wi-fi简介 5.14.2 实现原理 5.14.3 具体实现 5.15 获取sim卡内信息 5.15.1 sim卡简介 5.15.2 实现原理 5.15.3 ...

    TCP/IP详解

    6.11 资源记录 53 6.12 小结 54 第7章 WINS 55 7.1 NetBIOS 55 7.2 NetBIOS名字解析 57 7.3 动态NetBIOS名字解析 58 7.3.1 使用WINS的优点 58 7.3.2 WINS如何工作 59 7.3.3 配置WINS客户机 60 7.3.4 为代理配置WINS ...

    Struts2属性文件详解

    Struts2属性文件详解 struts.configuration 该属性指定加载Struts 2配置文件的配置文件管理器.该属性的默认值是org.apache.Struts2.config.DefaultConfiguration, 这是Struts 2默认的配置文件管理器.如果需要实现...

Global site tag (gtag.js) - Google Analytics