[转] 走出Java资源加载的迷宫
From:http://blog.csdn.net/jia20003/article/details/7490637
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源代码如下:
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编程语言创建一个迷宫游戏。首先,我们要了解迷宫游戏的基本概念,然后分析两种常见的迷宫生成算法:随机布点法和图的深度优先遍历法。接着,我们将讨论如何在游戏中实现自动...
【Java课程设计-走迷宫】是一个以Java编程为基础的迷宫游戏项目,旨在通过实践提升学生对面向对象编程的理解和应用能力。该课程设计主要包括以下几个核心知识点: 1. **面向对象编程**:整个游戏的设计将围绕面向...
在走迷宫游戏中,这可能涉及处理无效的用户输入、资源加载失败等。 8. **文件操作**:为了保存和加载游戏进度,可以学习如何在Java中读写文件,例如使用File、FileInputStream和FileOutputStream等类。 9. **测试...
在Java编程领域,走迷宫问题是一个经典的算法挑战,它涉及到路径查找和搜索策略。这个“java版走迷宫”项目提供了一种解决方案,对于初学者来说,它具有极高的学习价值,可以帮助深入理解Java语言以及算法应用。下面...
Java图形界面迷宫问题 Java图形界面迷宫问题是使用Java语言编写的图形用户界面程序,目的是解决迷宫问题。本节将详细介绍Java图形界面迷宫问题的实现原理、关键技术点和实际应用。 Java图形界面 Java图形界面是...
Java迷宫算法;Java迷宫算法;Java迷宫算法;Java迷宫算法;Java迷宫算法;Java迷宫算法;Java迷宫算法
通过java实现的迷宫课程设计。分成算法部分和界面部分,算法部分涉及到迷宫生成算法,深度优先,广度优先,运用了栈和队列等容器。界面部分采用javafx实现。有显示迷宫路线,更改迷宫大小,展示迷宫解谜动画过程。...
在本文中,我们将深入探讨如何使用Java实现基于迷宫的自动寻路算法。这个项目的目标是设计一个系统,允许用户通过鼠标点击设定目的地,然后由一个方块角色自动找到从起点到终点的路径。该系统利用了Java的...
Java迷宫课程设计是一项常见的编程练习,旨在帮助初学者掌握Java编程语言以及图形用户界面(GUI)开发。在这个项目中,我们使用了JavaFX库来创建用户界面,它是一个强大的工具,提供了丰富的功能来构建现代、动态的...
【Java 走迷宫】是一款使用Java编程语言开发的小型游戏,它具有图形用户界面(GUI),允许玩家通过键盘操作来控制角色在迷宫中寻找出路。这个游戏展示了Java在图形化编程和算法设计方面的应用。 一、Java GUI编程...
在Java编程中,"JAVA实现走迷宫"通常是指通过编程设计一个算法或程序,让一个虚拟角色在预设的迷宫环境中找到从起点到终点的最短路径。在这个过程中,我们可以采用不同的方法,比如深度优先搜索(DFS)、广度优先...
java实现随机迷宫生成、走迷宫小游戏的完整代码,初始化迷宫生成,按下空格为系统提示,上下左右控制移动。本实例需要从 .txt 文件中读取迷宫并绘制。 本程序适用于java程序员巩固类与对象、文件读取、事件响应、...
Java课程设计中的“走迷宫”项目是一个典型的算法实践,旨在帮助学生掌握Java编程语言以及图形用户界面(GUI)的设计。在这个项目中,主要涉及以下几个关键知识点: 1. **Java基础**:首先,你需要了解Java的基本...
老鼠走迷宫,用数组跌打计算。 老鼠走迷宫,用数组跌打计算。
### Java 实现走迷宫算法解析 #### 一、引言 本文主要介绍了一种基于Java语言实现的迷宫寻路算法。通过分析给定代码片段,我们可以深入了解其设计思路及实现细节。此算法适用于解决二维迷宫问题,即在一个由0和1...
总之,这个Java实现的迷宫最短路径算法项目是一个很好的学习资源,它涵盖了数据结构(如坐标位置类)、路径搜索算法以及如何在Java中编写清晰的代码。通过研究这些代码,开发者可以提升自己的算法理解和编程技能。
标题中的“一个简单的java迷宫生成程序”表明我们要讨论的是一个使用Java编程语言实现的算法,该算法用于创建迷宫。迷宫生成是计算机图形学和算法设计的一个有趣领域,通常涉及深度优先搜索(DFS)或Prim算法等方法...
Java开发走迷宫可视化源码程序是一个以广度优先搜索(BFS)算法为基础的迷宫求解项目,旨在提供一种直观的方式来展示迷宫的最短路径。在本项目中,我们将深入探讨BFS算法、Java编程语言以及可视化技术在解决这类问题...
《Java编程实现自定义迷宫游戏的探索与实践》 迷宫游戏,作为一种深受人们喜爱的智力挑战游戏,历史悠久,其复杂性和趣味性并存。在计算机科学领域,利用编程语言构建迷宫游戏已经成为一种常见的学习和娱乐方式。...
总之,这个"java多线程迷宫生成程序"是一个很好的学习资源,它将多线程、图形渲染和算法应用巧妙地结合在一起,为开发者提供了一个实战练习平台,有助于提升对并发编程和动态图形生成的理解。通过深入研究源代码,你...