篇二十一:Java程序中读取配置文件

读取配置文件

  1、web项目运行时,在程序中获取

    优点:代码简单,统一配置,多个文件也只是需要在配置文件中添加就可以了

    缺点:只能在web工程中使用,或者Junit中使用,Java工程不支持

  2、Java工程运行时,在程序中获取

    优点:支持Java工程,可以写一个公共方法,然后在任意位置使用

    缺点:不能统一加载,只能在使用的时候去调用方法查询,代码相对多一点

一、web项目运行时获取

  1、继承PropertyPlaceholderConfigurer

package com.common.util.resource;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.MissingResourceException;
import java.util.Properties;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;

public class PropertiesUtil extends PropertyPlaceholderConfigurer {

    private static Map<String, String> ctxPropertiesMap;
    //在springContext.xml文件中依赖bean,可以初始化
    private List<String> decryptProperties;
    
    @Override
    protected void loadProperties(Properties props) throws IOException {
        //读取配置文件中的值
        super.loadProperties(props);
        ctxPropertiesMap = new HashMap<String, String>();
        for(Object key:props.keySet()){
            String keyStr = key.toString();
            String value = props.getProperty(keyStr);
            if(decryptProperties != null && decryptProperties.contains(keyStr)){
                props.setProperty(keyStr, value);
            }
            ctxPropertiesMap.put(keyStr, value);
        }
    }

    /**
     * 根据key获取值
     * @param key:键
     * @return
     */
    public static String getString(String key){
        try {
            return ctxPropertiesMap.get(key);
        } catch (MissingResourceException e) {
            return null;
        }
    }
    
    /**
     * 根据key获取值
     * @param key:键
     * @param defaultValue:值为空时的默认值
     * @return
     */
    public static String getString(String key,String defaultValue){
        String value = ctxPropertiesMap.get(key);
        if(StringUtils.isEmpty(value)){
            return defaultValue;
        }
        return value;
    }
    
    /**
     * 根据key获取值
     * @param key:键
     * @return
     */
    public static int getInt(String key){
        return Integer.parseInt(ctxPropertiesMap.get(key));
    }
    
    /**
     * 根据key获取值
     * @param key:键
     * @param defaultValue:值为空时的默认值
     * @return
     */
    public static int getINt(String key,int defaultValue){
        String value = ctxPropertiesMap.get(key);
        if(StringUtils.isEmpty(value)){
            return defaultValue;
        }
        return Integer.parseInt(value);
    }
    
    public List<String> getDecryptProperties() {
        return decryptProperties;
    }

    public void setDecryptProperties(List<String> decryptProperties) {
        this.decryptProperties = decryptProperties;
    }
    
    public static void main(String[] args) {
        System.out.println(Integer.parseInt(""));
    }
    
}

  2、springcontext.xml中配置

        <!-- 项目运行时,读取配置文件到java Properties类中,供运行中的程序获取使用 -->
        <bean class="com.common.util.resource.PropertiesUtil">
            <property name="locations">
                <list>
                    <!-- 所有配置文件的路径在parent工程中统一配置路径 -->
                    <value>${system.basic.config.path}</value>
                </list>
            </property>
        </bean>            

  3、在Java代码中使用

PropertiesUtil.getString("jdbc.user");

 

二、Java工程运行时,在程序中获取

package com.common.util.resource;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.ResourceBundle;

/**
 * 资源文件工具类
 *     1、建议把资源文件统一放置在 src/main/resource 路径下,如果要区别对待,可以在该路径下添加包
 *  2、资源文件的路径写相对于 src/main/resource 的路径,文件名不包含文件后缀
 *  3、ResourceBundle解析中文乱码,先安装 Properties Editor插件,然后参考getValue(String key)方法处理
 * @author liuguangping
 *
 */
public class ResourceUtil {

    private ResourceBundle resourceBundle;
    
    /**
     * 私有方法获取资源文件
     * @param resource:文件放到resource路径下面,文件名不需要文件类型(.properties)
     */
    private ResourceUtil(String resource){
        resourceBundle = ResourceBundle.getBundle(resource);
    }
    
    /**
     * 获取ResourceUtil对象
     * @param resource
     * @return
     */
    public static ResourceUtil getResourceUtil(String resource){
        return new ResourceUtil(resource);
    }
    
    /**
     * 根据key获取值:先通过ResourceUtil.getResourceUtil(resource)方法获取ResourceBundle对象
     * @param key
     * @return
     */
    public String getValue(String key){
        try {
            return new String(resourceBundle.getString(key).getBytes("ISO-8859-1"),"UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return null;
        }
    }
    
    /**
     * 获取资源文件所有key-value值:需先初始化ResourceUtil对象
     * @return
     */
    public Map<String, String> getMap(){
        Map<String, String> map = new HashMap<String, String>();
        try {
            for(String key:resourceBundle.keySet()){
                map.put(key, resourceBundle.getString(key));
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        return map;
    }
    
    /**
     * 修改properties文件的值,功能未实现,功能待完善
     * @param resource
     * @param key
     * @param value
     */
    public static void updateValue(String resource,String key,String value){
        Properties pro = new Properties();
        InputStream in = null;
        try {
//            
            String filePath = ResourceUtil.class.getResource(resource).getFile();
            System.out.println(filePath);
//            in = ResourceUtil.class.getResourceAsStream(filePath);
            in = new BufferedInputStream(new FileInputStream(filePath));
            pro.load(in);
            FileOutputStream out = new FileOutputStream(filePath);
            pro.put(key, value);
            pro.store(out, "配置文件修改");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

posted @ 2017-07-12 00:22  刘广平  阅读(318)  评论(0)    收藏  举报