使用property file 来customize java application

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;


public final class staticBlock {
    private final static Properties mProp = new Properties();
    private final static String mPropertyFile = "functional.properties";

    //private static void initProperty(String ipPropFile)
//    {下面的try-catch被放到这里的static block里面,可以节约一个函数的调用。这样做的话,那些类似于getKey方法在调用时,就不用check property
//  file是否已经被初始化了。 但注意,static 块中使用的成员变量必须已经声明过了(前向声明),否者会报错,这也是个static 变量的特别之处
 static{
        try {
            FileInputStream fis = new FileInputStream(mPropertyFile);
            mProp.load(fis);
        } catch (FileNotFoundException e ) {
            e.printStackTrace();
        } catch (IOException exception){
            System.out.println(exception.getCause() + exception.getMessage());
            exception.printStackTrace();
        }
    }
    public static String getKey(String ipKey)
    {
         //return System.getProperty(ipKey);
         //initProperty(mPropertyFile);
         return mProp.getProperty(ipKey);
    }

    public static void main(String [] args){
               System.out.println(staticBlock.getKey("ROLE"));
    }

}

我这里调用property类只为了读取配置信息。


配置文件:

ROLE=slingshot.di.onling_yuidtosid

2.

Properties

public class Properties
extends Hashtable<Object,Object>
The Properties class represents a persistent set of properties. The Properties can be saved to a stream or loaded from a stream. Each key and its corresponding value in the property list is a string.


3.用法参照:

http://fluagen.blog.51cto.com/146595/409262

使用JAVA读写Properties属性文件

Properties属性文件在JAVA应用程序中是经常可以看得见的,也是特别重要的一类文件。它用来配置应用程序的一些信息,不过这些信息一般都是比较少的数据,没有必要使用数据库文件来保存,而使用一般的文本文件来保存,如果是通过File直接保存的话,可能在存储和读取上都不是很方便,但如果保存为Properties文件就不一样了,属性文件都有键值对应的,在JAVA的包中,有提供专门的操作属性文件的类。这个类就是 java.uitl.Properties类,由于Properties类是一个集合类,所以,Properties会将属性以集合的方式读写。

注意:下面的代码中对于抛出的异常都未采取捕获的方式,自己在编写程序的时候一定要注意捕获异常,推荐将捕获的异常处理掉。

Properties类继承字Hashtable类,采用键值对应的存储方式,在使用Properties类管理属性文件时有什么方便的呢?Properties类有专门的读写方法来读写Properties属性文件,不用担心读写的格式问题,只要为Properties类提供一个读写流即可。Properties用于读写属性文件的方法分别是:
  

Java代码
  1. //读取属性文件流的方法    
  2.    public void load(InputStream inStream) throws IOException {}    
  3.    //写属性文件流的方法   
  4.    public void store(OutputStream out, String comments) throws IOException {}   


首先,我们来看看如何从一个属性文件中读取属性。

假定我们已经新建了一个属性文件,名为prop.properties,内容如下:

  

Java代码
  1. sitename=abcjava    
  2.    siteurl=www.abcjava.com   



我们要做的第一步就是要将文件读取到Properties类对象中,由于load有一个参数是InputStream,所以我们可以用 InputStream的子类FileInputStream将属性文件读取到Properties对象中,知道prop.properties的路径,我们就用FileInputStream(String name)构造函数:

  

Java代码
  1. Properties prop = new Properties();//属性集合对象   
  2.    FileInputStream fis = new FileInputStream("prop.properties");//属性文件流   
  3.    prop.load(fis);//将属性文件流装载到Properties对象中   





接下来我们将做的事情就是如果读取一个属性,因为属性文件中的每一行都是一个键值对应,所以每一行都代表了一个属性对象,每一行都将以键和值的关系存储到Properties中,Properties类提供了getProperty(String key)方法用来通过键名读取键值,当key在属性集合中找不到时又想为key在程序中赋予一个值时可以使用public String getProperty(String key, String defaultValue)方法,这个方法的意思就是用指定的键在属性列表中搜索属性。如果在属性列表中未找到该键,则接着递归检查默认属性列表及其默认值。如果未找到属性,则此方法返回默认值变量:

  

Java代码
  1. //获取属性值,sitename已在文件中定义   
  2.    System.out.println("获取属性值:sitename=" + prop.getProperty("sitename"));    
  3.    //获取属性值,country未在文件中定义,将在此程序中返回一个默认值,但并不修改属性文件   
  4.    System.out.println("获取属性值:country=" + prop.getProperty("country""中国"));   





在知道怎么读取属性文件之后我们还有一个很重要的事情就是要修改和添加新的属性到属性文件,这里就是使用public void store(OutputStream out, String comments)方法,这个方法是将属性集合写到一个OutputStream流中,同InputStream流一样,这里同样是使用其子类 FileOutputStream(String name),这里就不多说了。

在保存属性集合到文件之前,我们还有一件事情就是如何修改和添加新的属性到属性集合,这里使用了一个方法就是setProperty(String key, String value),这个方法就是当属性集合中存在指定的key时,就修改这个key的值,如果不存在,就新建一个key,同样是通过键值关系保存的,但值得注意的是,Properties类继承自Hashtable,所以也可以用Hashtable的put和putAll方法保存,但强烈反对使用这两个方法,因为它们允许调用方插入其键或值不是 Strings 的项。相反,应该使用 setProperty 方法。如果在“有危险”的 Properties 对象(即包含非 String 的键或值)上调用 store 或 save 方法,则该调用将失败。那好,下面我们就来看看修改、添加和保存属性的程序:

//修改sitename的属性值
prop.setProperty("sitename", "Boxcode");
//添加一个新的属性studio
prop.setProperty("studio", "Boxcode Studio");
//文件输出流
FileOutputStream fos = new FileOutputStream("prop.properties");
//将Properties集合保存到流中
prop.store(fos, "Copyright (c) Boxcode Studio");
fos.close();//关闭流



接下就是整个程序的源代码:

 

Java代码
  1. import java.io.FileInputStream;   
  2. import java.io.FileOutputStream;   
  3. import java.util.Properties;   
  4.   
  5. public class PropertyEditor {   
  6.     public static void main(String[] args) throws Exception {   
  7.         Properties prop = new Properties();// 属性集合对象  
  8.         FileInputStream fis = new FileInputStream("prop.properties");// 属性文件输入流  
  9.         prop.load(fis);// 将属性文件流装载到Properties对象中  
  10.         fis.close();// 关闭流  
  11.   
  12.         // 获取属性值,sitename已在文件中定义  
  13.         System.out.println("获取属性值:sitename=" + prop.getProperty("sitename"));   
  14.         // 获取属性值,country未在文件中定义,将在此程序中返回一个默认值,但并不修改属性文件  
  15.         System.out.println("获取属性值:country=" + prop.getProperty("country""中国"));   
  16.   
  17.         // 修改sitename的属性值  
  18.         prop.setProperty("sitename""Boxcode");   
  19.         // 添加一个新的属性studio  
  20.         prop.setProperty("studio""Boxcode Studio");   
  21.         // 文件输出流  
  22.         FileOutputStream fos = new FileOutputStream("prop.properties");   
  23.         // 将Properties集合保存到流中  
  24.         prop.store(fos, "Copyright (c) Boxcode Studio");   
  25.         fos.close();// 关闭流  
  26.     }   
  27. }  





在我们知道如何读写一个属性文件之后,我们仍然还有很多需要注意的问题,因为load和store方法都是按照ISO-8859-1的编码方式读写属性流文件的,而ILatin1 的字符和某些特殊字符,而对于非Latin1 的字符和某些特殊字符,则要使用与字符和字符串字面值所用的类似转义序列,以值和元素的形式来表示它们。所以当我们在处理中文时,不可以在直接修改属性文件时,将中文的值赋予给属性,而是要在JAVA程序中通过setProperty方法给属性赋予中文的值,因为这样store会将中文转换成 unicode码,在读取时系统会将读取到的unicode码按系统的编码打印出来,对于中文系统,通常是GBK码,这样中文才能够正常显示。


3.1 Java读取properties文件的思考

Java读取properties文件的思考
 
Java读取properties文件的方法比较多,网上我最多的文章是“Java读取properties文件的六种方法”,但在Java应用中,最常用还是通过java.lang.Class类的getResourceAsStream(String name) 方法来实现,但我见到众多读取properties文件的代码中,都会这么干:
 
InputStream in = getClass().getResourceAsStream("资源Name");
 
这里面有个问题,就是getClass()调用的时候默认省略了this!我们都知道,this是不能在static(静态)方法或者static块中使用的,原因是static类型的方法或者代码块是属于类本身的,不属于某个对象,而this本身就代表当前对象,而静态方法或者块调用的时候是不用初始化对象的。
 
问题是:假如我不想让某个类有对象,那么我会将此类的默认构造方法设为私有,当然也不会写别的共有的构造方法。并且我这个类是工具类,都是静态的方法和变量,我要在静态块或者静态方法中获取properties文件,这个方法就行不通了。
 
那怎么办呢?其实这个类就不是这么用的,他仅仅是需要获取一个Class对象就可以了,那还不容易啊--取所有类的父类Object,用Object.class难道不比你的用你正在写类自身方便安全吗 ?呵呵,下面给出一个例子,以方便交流。
 
import java.util.Properties;
import java.io.InputStream;
import java.io.IOException;

/**
* 读取Properties文件的例子
* File: TestProperties.java
* User: leizhimin
* Date: 2008-2-15 18:38:40
*/

public final class TestProperties {
     private static String param1;
     private static String param2;

     static {
        Properties prop = new Properties();
        InputStream in = Object. class.getResourceAsStream( "/test.properties");
         try {
            prop.load(in);
            param1 = prop.getProperty( "initYears1").trim();
            param2 = prop.getProperty( "initYears2").trim();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

     /**
     * 私有构造方法,不需要创建对象
     */

     private TestProperties() {
    }

     public static String getParam1() {
         return param1;
    }

     public static String getParam2() {
         return param2;
    }

     public static void main(String args[]){
        System.out.println(getParam1());
        System.out.println(getParam2());
    }
}
 
运行结果:
151
152

Process finished with exit code 0
 
 
当然,把Object.class换成int.class照样行,呵呵,大家可以试试。
 
另外,如果是static方法或块中读取Properties文件,还有一种最保险的方法,就是这个类的本身名字来直接获取Class对象,比如本例中可写成TestProperties.class,这样做是最保险的方法。


上面的getResourceAsStream,是从jar中读配置文件的,不觉把配置文件写到jar 中会有什么好处,它的参数可以是绝对路径(相对于jar的)




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值