`

ResourceBundle和Properties 的使用!

 
阅读更多

一般来说,ResourceBundle类通常是用于针对不同的语言来使用的属性文件。

而如果你的应用程序中的属性文件只是一些配置,并不是针对多国语言的目的。那么使用Properties类就可以了。

通常可以把这些属性文件放在某个jar文件中。然后,通过调用class的getResourceAsStream方法,来获得该属性文件的流对象,再用Properties类的load方法来装载。

示例如下:

Class TestLoad  {
           
public   static   void  main( String[] argv)  {
                     InputStream 
is   =  TestLoad. class .getResourceAsSteam( " myprops.properties " );
                     Properties p 
=   new  Properties();
                     p.load(
is );
                     System.
out .println(p. get ( " MAIL_SERVER_HOSTNAME " ));
           }

}

关于ResourceBundle

有时候有些简单的配置文件可以没必要使用xml,其实ResourceBundle类就已经做的很好的。它甚至可以搜索到classpath里的jar文件中一些properties文件。

例如在jar文件中的根目录放置一个文件:test.properties,然后只要这个jar文件在classpath里。就可以使用这样的语句来获得一些属性:

  ResourceBundle rb = ResourceBundle.getBundle("test");
  String s = rb.getString("MQ_Server_Address");
  System.out.println(s);

 

 

 

 

我们可以在每个对象中用ResourceBundle来读配置文件设置自己的值,也可以用一个固定的对象去读取然后保存下来以便以后使用。在每个 class中都去读配置文件会导致代码散乱,所以,只用一个class来进行读取是比较合理的做法。另外,由于I/O的速度比较慢,如果负责读取配置文件 的class是在每次用到这些配置项的时候去读文件,就容易成为性能上的瓶颈。为避免这样的情况,可以在初始化的时候就把配置项一次全部读入,并保存在静 态成员变量中。不过不排除会有对配置项进行动态读取的需求(因为某些应用是不能停掉的,比如应用服务器。在这些应用运行期间更新了配置文件,就需要在不不 关闭应用的情况下重新读入配置项)。以下的例子只考虑了静态读取的情况,如果是动态读取,则可以把读取配置文件的代码放到某个方法中,通过对某个事件的响 应来调用该方法更新配置项。

假设我们用来读取配置文件的class叫TestResourceBundle,配置项的值来自一个叫 property_en.properties的文件(该文件应该放到TestResourceBundle所对应的CLASSPATH的目录),有两个 值需要配置:name和value。首先,需要在该class中定义一些字符串常量,如下:

public static final String PROPERTIES_FILE_NAME = "property";
public static final String MY_NAME_KEY = "name";
public static final String MY_VALUE_KEY = "value";


其中PROPERTIES_FILE_NAME指出了文件的名字。实际读取的文件应该是property_en.properties,但 是只需要告诉ResourceBundle文件名是"property"就足够了。下划线和后面的"en"表示的是本地化信息。这里的en代 表"ENGLISH",后缀properties是默认的。MY_NAME_KEY和MY_VALUE_KEY表示配置项在配置文件中的名字,用 ResourceBundle的getString方法根据这些名字去读取相应的值。

然后,定义需要配置的变量。这些变量应该是静态的:
private static String myName;
private static String myValue;

然后进行静态初始化:
static {
 try {
   ResourceBundle bundle = ResourceBundle
     .getBundle(PROPERTIES_FILE_NAME, Locale.ENGLISH);
   myName = bundle.getString(MY_NAME_KEY).trim();
   myValue = bundle.getString(MY_VALUE_KEY).trim();
 }
 catch(Exception ex) {
   System.err.println(  "[Property]:Can't Load property.properties");
   myName = "default name";
   myValue = "default value";
   System.out.println(  "myName will use the default value: " + myName);
   System.out.println(  "myValue will use the default value: " + myValue);
 }
}
 ResourceBundle bundle = ResourceBundle
  .getBundle(PROPERTIES_FILE_NAME, Locale.ENGLISH);
这 行代码初始化了一个ResourceBundle,Locale.ENGLISH用于指明本地化情况,因此会 从"property_en.properties"中去读取配置项。如果是Locale.CHINA,则会从 property_zh.properties中读取。这种机制使得程序的本地化变得简单。

 myName = bundle.getString(MY_NAME_KEY).trim();
这行代码读入配置文件中名为"name"的变量的值,并赋给静态变量myName。
此外这段代码还包含了例外处理,当读取失败的时候,配置项会使用缺省值。
这样,该类就通过ResourceBundle读取外存上的配置文件对数据进行了配置。

property_en.properties文件的内容如下
# properties sample
#
name=sega
value=100

其中以'#'开头的行为注释,ResourceBundle在遇到这些行的时候会忽略掉。

以下为完整的测试代码:

public class TestResourceBundle {
 public static final String PROPERTIES_FILE_NAME = "property";
 public static final String MY_NAME_KEY = "name";
 public static final String MY_VALUE_KEY = "value";
 
 private static String myName;
 private static String myValue;
 static {
   try {
     ResourceBundle bundle = ResourceBundle
  .getBundle(PROPERTIES_FILE_NAME, Locale.ENGLISH);
     myName = bundle.getString(MY_NAME_KEY).trim();
     myValue = bundle.getString(MY_VALUE_KEY).trim();
   }
   catch(Exception ex) {
  System.err.println(    "[Property]:Can't Load property.properties");
  myName = "default name";
  myValue = "default value";
  System.out.println(    "myName will use the default value: " + myName);
  System.out.println(    "myValue will use the default value: " + myValue);
   }
 }
 
 public void print() {
  System.out.println("My name is: " + myName);
  System.out.println("My value is: " + myValue);
 }
 public static void main(String[] args) {
  TestResourceBundle test = new TestResourceBundle();
  test.print();
 }
}

 

分享到:
评论

相关推荐

    ResourceBundle与Properties读取maven中resources目录下的资源文件

    这里面有详细的处理maven项目中resources目录下的资源文件,方便快捷的得到或设置资源文件中的内容,本人亲测,里面还有示例

    使用J2SE API读取Properties文件的六种方法

    使用java.util.Properties类的load()方法  示例: InputStream in = lnew BufferedInputStream(new FileInputStream(name));  Properties p = new Properties();  p.load(in);  2。使用java.util....

    ResourceBundle

    ResourceBundle Editor (eclipse-rbe)是一个用于编辑本地化的属性文件(localized properties files)。它让你通一个屏幕就能够同时管理所有相关联属性文件中的key/value信息。它所具有的功能包括:自动为Keys分类,...

    读取properties、xml格式的配置文件的实例

    这是一个简单实现读取properties、xml格式的配置文件... 方法一:java.util.ResourceBundle读取properties类型文件; 方法二:java.util.Properties读取properties类型文件; 二、读取xml类型文件 dom4j读取xml文件;

    Java读取含中文key的properties文件

    Java读取含中文key的properties文件,并且可以使用反射调用方法

    j18n - Java ResourceBundle I18N-开源

    j18n替代了java.util.ResourceBundle以支持Unicode属性文件。 您可以将UTF8字符放入* .properties中,唯一的代码更改是将“ ResourceBundle.getBundle(..)”替换为“ J18n.getBundle(..)”。

    ResourceBundle类在jsp中的国际化实现方法

    首先是两个资源文件,分别为msg_en_US.properties和msg_zh_CN.properties   显然中文字符是需要转换过来的。 这是jsp页面的代码 <%@ page language=java contentType=text/html; charset=UTF-8 ...

    java常用API总结

    Java 常用API的运用,效率及技巧 1. Java面向对象基本概念 2. System 3. String, StringBuffer 4. 数值,字符,布尔对象与简单类型的...8. ResourceBundle, Properties 9. Exceptions 10. JDBC类库 11. 常用设计模式

    Java 常用API的运用,效率及技巧

    Java 常用API的运用,效率及技巧 Java面向对象基本概念 2. System 3. String, StringBuffer 4. 数值,字符,布尔对象与简单类型的操作 ...8. ResourceBundle, Properties 9. Exceptions 10. JDBC类库 11. 常用设计模式

    ResourceBundleEditor_v0.7.7

    ResourceBundle Editor 是一个用于编辑本地化的属性文件(localized properties files)的 Eclipse 插件。它让你通一个屏幕就能够同时管理所有相关联属性文件中的 key/value 信息。它所具有的功能包括:自动为Keys分类...

    ResourceBundleEditor 资源文件编辑器 eclipse的资源文件编辑插件

    经常在做国际化的时候编辑properties文件。转换文件字符总是让人比较繁琐。有了这个插件所见即所得。我们输入中文的时候自动就转换完毕了。同样的uncode文字我们也可以马上知道内容是什么进行修改。超方便,超好用,...

    java读取配置文件

    private ResourceBundle resourceBundle; public CommonParam() { propertyFileName = "com/test/dao/SysConfig"; resourceBundle = ResourceBundle.getBundle(propertyFileName); } public String ...

    uilocalizer

    通过字节码操作,通过从.propreties文件中读取值来替换@Localizable字符串的初始化(使用ResourceBundle ) 从源代码生成具有默认值的.properties模板文件 如果使用@LocalizationProperty批注,则该工具仅从源代码...

    Maven2 的新特性.7z

    在Maven2中,配置使用settings.xml,它取代了原有的project.properties和build.properties。配置在Maven2中存在两种级别: • 用户级,针对操作系统登录用户而言。一般在$home/.m2/,对于windows用户,就是目录:C:\...

    JavaMail的所有内容

    Properties prop = new Properties(); prop.put("mail.smtp.auth", "true");// 制定登录时必须进行验证 prop.put("mail.smtp.host", mailServer); MyAuthenticator mm=new MyAuthenticator("1531671930@qq....

    secondarysort.zip

    在官方自定义SecondarySort例子的基础上添加了自定义Counter的功能,并为其添加.properties文件实现ResourceBundle

    JavaWeb项目网上书店.rar

    一个消息资源包:基名_语言_国家.properties ResourceBundle Locale 3、日期时间格式化:类型转换 String--------->java.util.Date java.util.Date--------->String DateFormat 4、数字的格式化:货币 5...

    lab-2-Alex-PtGa:GitHub Classroom创建的lab-2-Alex-PtGa

    使用标准排除项。 流I / O: 释放资源: AutoClosable界面 Closable界面 try-with-resources构造。 二进制I / O: InputStream类 OutputStream类。 文字I / O: 文字输入: Reader班 InputStreamReader类 ...

    发送邮件的Java代码

    // ResourceBundle mailProps = ResourceBundle.getBundle("mail"); // 可以从配置文件读取相应的参数 Properties props = new Properties(); String smtp = "smtp.qq.com"; // 设置发送邮件所用到的smtp ...

    Pressure-test-for-MySql:由java实现的一个多线程对Mysql数据库测试

    JDBCUtil 类和 jdbc.properties ,后者为mysql数据库root用户账户信息、数据库驱动以及数据库地址的配置信息。前者是数据库的连接获取以及关闭流方法。 (2)testing包: Info负责信息的描述 Gui类负责用户界面以及...

Global site tag (gtag.js) - Google Analytics