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程序运行需要的一切文本文件等等。
分享到:
相关推荐
4. 使用IConfigLoader的`load()`方法,结合IConfigProvider提供的资源加载配置,并转化为相应的Java对象。 这种设计模式允许灵活地添加新的配置加载方式,只需实现新的IConfigLoader和IConfigProvider,而无需修改...
Java动态加载数据库驱动是解决在同一个系统中需要与多种数据库版本进行交互问题的一种技术手段。在实际开发中,由于各种项目可能需要连接不同类型的数据库,如Oracle、SQL Server等,或者同一种数据库的不同版本,...
本资源包提供了详细的Java数据库技术讲解,包括PPT演示文稿、源代码示例以及一份Java入门电子书作为额外的学习资料。 首先,Java入门电子书中可能涵盖了基础的Java编程概念,如变量、数据类型、控制结构、类与对象...
3. **系统类加载器(System ClassLoader)**:也称为应用类加载器,由sun.misc.Launcher$AppClassLoader实现,它负责加载用户类路径(ClassPath)上的所有类和资源。 4. **自定义类加载器(User-defined ...
Java 类加载过程是Java虚拟机...理解Java类加载过程有助于优化程序性能,如通过自定义类加载器实现热部署,或者通过控制初始化时机来避免不必要的资源消耗。同时,这也对理解JVM内存模型和异常处理机制有着重要的作用。
本资源详细阐述了如何在Java中调用DLL,以及在这个过程中可能遇到的问题和注意事项。 首先,Java本身并不直接支持调用DLL,但可以通过Java Native Interface (JNI) 来实现这一目标。JNI是一种接口,允许Java代码和...
在日常开发中,反射可用于动态加载类、运行时检查对象类型、实现序列化和反序列化、以及在不了解对象类型的情况下调用方法和设置属性。 然而,虽然反射提供了很大的便利,但也有潜在的性能问题和安全性风险。频繁...
Java是世界上最流行的编程语言之一,尤其在企业级应用开发领域占据主导地位。..."Java面试题答案详解"这份资源将涵盖以上所有知识点,并提供具体的问题和解答,帮助求职者在面试中表现出色,提升自己的Java技能水平。
此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会java语言的读者快速地从java基础知识的学习中过渡到java web的学习与开发上. 第1部分 xml篇. 第1章 xml...
Java命令参数详解是Java开发中不可或缺的一部分,它们允许开发者对JVM(Java虚拟机)的行为进行微调,以优化程序的性能、控制内存使用、调试和监控等。本文将深入探讨一些关键的Java命令行参数。 1. **-version**: ...
### Java数据库连接(JDBC)详解 #### 一、引言 在现代软件开发中,数据库是存储和管理数据的关键组件之一。Java作为一种广泛使用的编程语言,提供了强大的工具和API来处理与数据库的交互,其中最重要的一项技术就是...
【Java开发详解视频教程(孙鑫)9a】是一套专为软件设计师打造的Java学习资源,由知名讲师孙鑫主讲。这个教程涵盖了Java编程的深入细节,旨在提升学员在Java开发领域的技能和理解力。通过这五个部分的课程,我们可以...
【标题】:“Tomcat与Java.Web开发技术详解”是一本深度探讨Tomcat服务器与Java Web应用开发的专业资料,旨在帮助开发者全面理解并掌握这两项关键技术。 【内容详解】: 1. **Tomcat介绍**:Tomcat是Apache软件基金...
### Java操作Excel详解 #### 一、Java Excel API简介 Java Excel API是一个强大的开源库,允许开发者使用Java语言轻松地创建、更新以及读取Excel文件。这个库支持多种Excel文件格式,包括较旧版本(如.xls)和较新...
《Java Web开发详解》这个资源包含了多个章节和附加材料,为学习者提供了全面的Java Web开发知识。在Java Web开发领域,我们主要涉及以下几个关键知识点: 1. **基础概念**:Java Web开发是使用Java语言进行服务器...
在Java中,通常使用`try-with-resources`语句自动关闭这些资源,以避免资源泄露。 使用Java Derby的一个关键优点是其易于集成。由于它是纯Java实现,可以在任何Java应用程序中无缝使用,尤其适合于桌面应用、服务器...
此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会java语言的读者快速地从java基础知识的学习中过渡到java web的学习与开发上. 第1部分 xml篇. 第1章 xml...
【Java Web开发详解】 Java Web开发是编程领域中一个重要的方向,主要涉及使用Java语言进行Web应用程序的开发。这个主题涵盖了多个知识点,包括基础概念、技术框架和开发流程。 1. **Servlet与JSP**: Java Web的...
此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会java语言的读者快速地从java基础知识的学习中过渡到java web的学习与开发上. 第1部分 xml篇. 第1章 xml...
### Java 类加载机制详解 Java 类加载机制是Java运行时环境的一个核心组成部分,它负责将编译后的Java字节码加载到JVM中,并确保Java应用程序能够正确地运行。类加载机制不仅涉及到类的加载、验证、准备、解析和...