ResourceBundle

import java.io.UnsupportedEncodingException;
import java.util.ResourceBundle;

public class UtilConstant {
	/**
	 * 资源包包含特定于语言环境的对象。当程序需要一个特定于语言环境的资源时(如 String),程序可以从适合当前用户语言环境的资源包中加载它。使用这种方式,可以编写很大程度上独立于用户语言环境的程序代码,它将资源包中大部分(即便不是全部)特定于语言环境的信息隔离开来。 
	 * 这使编写的程序可以: 
	 * 1、轻松地本地化或翻译成不同的语言 
	 * 2、一次处理多个语言环境 
	 * 3、以后可以轻松进行修改,以便支持更多的语言环境 
	 * 资源包属于这样的系列,其成员共享一个公共的基本名称,但是名称中还有标识其语言环境的其他组件。例如,某个资源包系列的基本名称可能是 "MyResources"。该系列应该有一个默认资源包,其名称与其系列名相同( "MyResources"),如果不支持指定的语言环境,则应该将此资源包用作最后的手段。然后,此系列可根据需要提供特定于语言环境的成员,例如一个名为 "MyResources_de" 的德语资源包。 
	 * 一个系列中的每个资源包都包含相同的项,但是这些项已经针对该资源包所代表的语言环境进行了翻译。例如,"MyResources" 和 "MyResources_de" 可能有用在取消操作按钮上的 String。在 "MyResources" 中,String 可能包含 "Cancel",而 "MyResources_de" 中则可能包含 "Abbrechen"。 
	 * 如果不同的国家/地区有不同的资源,则可以对它们进行限定:例如,"MyResources_de_CH" 包含瑞士 (CH) 中包含德语 (de) 的对象。如果只想修改限定中的某些资源,就可以这样做。 
	 * 当程序需要特定于语言环境的对象时,它使用 getBundle 方法加载 ResourceBundle 类: 
	 * ResourceBundle myResources = ResourceBundle.getBundle("MyResources", currentLocale);
	 * 资源包包含键/值对。键唯一地标识了包中特定于语言环境的对象。下面是一个 ListResourceBundle 示例,它包含两个键/值对: 
	 * public class MyResources extends ListResourceBundle {
	 * 		protected Object[][] getContents() {
	 * return new Object[][] {
	 * // LOCALIZE THE SECOND STRING OF EACH ARRAY (e.g., "OK")
	 * {"OkKey", "OK"},
	 * {"CancelKey", "Cancel"},
	 * // END OF MATERIAL TO LOCALIZE
	 * };
	 * }
	 * }
	 * 键始终为 String 类型。在此示例中,两个键是 "OkKey" 和 "CancelKey"。在上面的示例中,值也是 String 类型,即 "OK" 和 "Cancel",但并非必须如此。值可以是任意对象类型。 
	 * 可以使用适当的获取方法从资源包中获取某个对象。因为 "OkKey" 和 "CancelKey" 都是字符串,所以应该使用 getString 获取它们: 
	 * button1 = new Button(myResources.getString("OkKey"));
	 * button2 = new Button(myResources.getString("CancelKey")); 
	 * 所有获取方法都需要将键作为参数并返回对象(如果找到的话)。如果未找到对象,则获取方法将抛出 MissingResourceException。 
	 * 除了 getString 之外,ResourceBundle 还提供了获取字符串数组的方法 getStringArray,以及用于其他任意对象类型的 getObject 方法。使用 getObject 时,必须将结果强制转换为适当的类型。例如: 
	 * int[] myIntegers = (int[]) myResources.getObject("intList");
	 * Java 平台提供了两个 ResourceBundle 的子类,即 ListResourceBundle 和 PropertyResourceBundle,这为创建资源提供了一种相当简单的方式。正如在前面示例中所看到的,ListResourceBundle 以键/值对的列表方式管理其资源。PropertyResourceBundle 则使用一个属性文件来管理其资源。 
	 * 如果 ListResourceBundle 或 PropertyResourceBundle 无法满足需求,那么可以编写自己的 ResourceBundle 子类。子类必须重写两个方法:handleGetObject 和 getKeys()。 
	 * ResourceBundle.Control
	 * ResourceBundle.Control 类提供通过带 ResourceBundle.Control 实例的 getBundle 工厂方法执行包加载进程所需的信息。为了启用非标准资源包格式、更改搜索策略或定义缓存参数,可以实现自己的子类。有关细节请参考类和 getBundle 工厂方法的描述。 
	 * 缓存管理
	 * getBundle 工厂方法创建的资源包实例是默认缓存的,如果资源包实例已经缓存,那么这些工厂方法将多次返回相同的资源包实例。getBundle 客户端可以清除缓存、使用生存时间值管理已缓存资源包实例的生命周期,或者指定不缓存资源包实例。有关细节请参考getBundle 工厂方法、clearCache、ResourceBundle.Control.getTimeToLive 和 ResourceBundle.Control.needsReload 的描述。 
	 * 示例
	 * 下面是一个极其简单的 ResourceBundle 子类示例 MyResources,它管理两个资源(对于大量的资源,应该使用 Map)。注意,如果某个“父级”ResourceBundle 处理具有相同值的相同键(如下面的 okKey),则无需提供值。 
	 * // default (English language, United States)
	 * public class MyResources extends ResourceBundle {
     * public Object handleGetObject(String key) {
     *     if (key.equals("okKey")) return "Ok";
     *     if (key.equals("cancelKey")) return "Cancel";
     *     return null;
     * }
     * public Enumeration<String> getKeys() {
     *     return Collections.enumeration(keySet());
     * }
     * // Overrides handleKeySet() so that the getKeys() implementation
     * // can rely on the keySet() value.
     * protected Set<String> handleKeySet() {
     *     return new HashSet<String>(Arrays.asList("okKey", "cancelKey"));
     * } 
     * }
     * // German language
     * public class MyResources_de extends MyResources {
     * public Object handleGetObject(String key) {
         * // don't need okKey, since parent level handles it.
         * if (key.equals("cancelKey")) return "Abbrechen";
         * return null;
     * }
     * protected Set<String> handleKeySet() {
         * return new HashSet<String>(Arrays.asList("cancelKey"));
     * }
     * }
     * 不必限制只使用 ResourceBundle 的单个系列。例如,可以有异常消息 ExceptionResources 的包集(ExceptionResources_fr、ExceptionResources_de 等)和窗口小部件 WidgetResource 的包集(WidgetResources_fr、WidgetResources_de 等);可以按自己喜欢的方式分解资源。 
	 */
	private ResourceBundle resourceBundle;
	/**
	 * 该类类型的实例.
	 */
	private static UtilConstant constant;

	/**
	 * 单例模式.
	 * @return
	 */
	public static UtilConstant getInstance() {
		if (constant == null) {
			constant = new UtilConstant();
			constant.init();
		}
		return constant;
	}

	/**
	 * 初始化.
	 */
	private void init() {
		// constant为放置在源文件目录根目录的constant.properties文件.
		resourceBundle = ResourceBundle.getBundle("const");
	}

	/**
	 * 获取key对应的value.
	 * 
	 * @param key
	 * @return
	 */
	public String getProperity(String key) {
		return resourceBundle.getString(key);
	}

	/**
	 * 获取UTF8编码字符串.
	 * 
	 * @param key
	 * @return
	 */
	public String getUTF8StringProperity(String key) {
		String result = null;
		try {
			result = new String(resourceBundle.getString(key).getBytes(), "UTF8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return result;
	}

	/**
	 * 测试.
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		UtilConstant instance = UtilConstant.getInstance();
		System.out.println(instance.getProperity("fruit"));
	}
}

const.properties配置文件内容:

fruit=apple
项目结构图:



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值