配置文件方式获取变量——工具类、ResourceBundle

本文主要针对新手,提取java配置文件中变量。

项目实际开发的时候,经常遇到需要通过配置文件获取可变变量的开发需求、或者通过外部文件获取sql的开发需求。

原因就不复述了,无非需要脱离开发环境更改变量云云。

本文主要提供两个简单方式:

  1. 通过工具类:.

    优点:通过文件流获取,通俗易懂,代码好移植。

    缺点:消耗资源,不适用数据量较大的项目。

  2. 通过java.util的工具类  ResourceBundle  获取:

    优点:java工具类获取,资源消耗小,国际化程度好,代码移植简单等等

    缺点:格式要求严格,某些特定场合需要复写底层或重写  ResourceBundle  类方法才能实现。

先说第一种实现:呃。其实没什么可说的  上传一个简单的demo代码吧  需要的小盆友可以直接移植过去,几乎不需要更改。这样也符合看这类文章人群的需求。

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

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class PropertyUtil {
    private static final Logger logger = LoggerFactory.getLogger(PropertyUtil.class);
    private static Properties props;
//    static{
//        loadProps();
//    }
//    private void loadProps(){
//	this.loadProps();
//    }
    synchronized static private void loadProps(String properties){
        logger.info("开始加载properties文件内容.......");
        props = new Properties();
        InputStream in = null;
        try {
//       第一种,通过类加载器进行获取properties文件流
            in = PropertyUtil.class.getClassLoader().getResourceAsStream(properties);
//        <!--第二种,通过类进行获取properties文件流-->
            //in = PropertyUtil.class.getResourceAsStream("/jdbc.properties");
            props.load(in);
        } catch (FileNotFoundException e) {
            logger.error("properties文件未找到");
        } catch (IOException e) {
            logger.error("出现IOException");
        } finally {
            try {
                if(null != in) {
                    in.close();
                }
            } catch (IOException e) {
                logger.error("properties文件流关闭出现异常");
            }
        }
        logger.info("加载properties文件内容完成...........");
        logger.info("properties文件内容:" + props);
    }

    public static String getProperty(String key,String properties){
        if(null == props) {
            loadProps(properties);
        }
        return props.getProperty(key);
    }

    public static String getProperty(String key, String defaultValue,String properties) {
        if(null == props) {
            loadProps(properties);
        }
        return props.getProperty(key, defaultValue);
    }
}

把这个类放到工具分类中,下次直接调用即可。

说明一下吧,上述部分是为灵活调用准备的,如果调用文件确定,或可以从静态资源中获取,可以开放static 这样也符合静态类加载原则。在初始化时候加载到jvm中,这样也是一种好习惯。

调用呢,也传一个吧,也方便刚学习的小盆友:

    public static void main(String[] args) {
        String pro = "context-app.properties";
	    String key = "jdbc.password";
	    String s =  PropertyUtil.getProperty(key,pro);
	    System.out.println(s);
    }

二、通过util.ResourceBundle调用:

关于ResourceBundle的具体类说明,这里就不再复述了,新接触代码的小盆友可以在其他帖子找一下,基础内容,很好理解。

import java.lang.reflect.Constructor;
import java.text.MessageFormat;
import java.util.Locale;
import java.util.ResourceBundle;

public class Test {

    public static final String PROPERTIES_FILE_NAME = "context-app";
    public static final String MY_DRIVER_KEY = "jdbc.driver";//properties: jdbc.driver
    public static final String MY_URL_KEY = "jdbc.url";//properties: jdbc.driver
    public static final String MY_NAME_KEY = "jdbc.username";//properties: jdbc.name
    public static final String MY_PASSWORD_KEY = "jdbc.password";//properties: jdbc.password
    private static String myUsername;
    private static String myDrider;

    static{
	
    	try {
	        ResourceBundle bundle = ResourceBundle.getBundle(PROPERTIES_FILE_NAME, Locale.CHINESE);
	        myDrider = bundle.getString(MY_DRIVER_KEY);
	        myUsername = bundle.getString(MY_NAME_KEY).trim();
	    } catch (Exception e) {
	        System.err.println(  "[Property]:Can't Load property.properties");
	        myUsername = "default username";
	        myDrider = "default drider";
	        System.out.println(  "myName will use the default value: " + myUsername);
//	    e.printStackTrace();
	    }
    }
    
    public static void main(String[] args) {
	    //基础方法开始(仅供了解方法)
        String bun = "context-app";
        ResourceBundle bundle = ResourceBundle. getBundle(bun);
	    String ss = bundle.getString(key);
	    try {
	       
	        System.out.println(ss );
	    } catch (Exception e) {
	        e.printStackTrace();
	    }
        //基础方法结束
        
        //实际应用(包含静态调用)
	    Test test;

	    try {
	        test = (Test)Class.forName("test.ws.Test").newInstance();//forName方法
	        test.print();
	    } catch (ClassNotFoundException e) {
	        e.printStackTrace();
	    } catch (InstantiationException e) {
	        e.printStackTrace();
    	} catch (IllegalAccessException e) {
	        e.printStackTrace();
	    }
    }

   public void print() {
	    System.out.println("My name is: " + myUsername);
	    System.out.println("My value is: " + myDrider);
   }

}

Test调用处用了反射,实际直接new也是一样的。

以上,仅供大家参考吧!有问题可以留言!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值