Java中有个类Properties(Java.util.Properties),主要用于读取Java的配置文件,将一些可能需要变化的值存放在properties中进行配置,通常为为.properties文件,其实就是普通的文本文件,文件的内容的格式是“键=值”的格式,文本注释信息可以用"#"来注释。尽量使用UTF-8格式存储。jdk自身提供的类有缺点,所以我们通常使用 commons-configuration框架进行解析。

1.1.1. Properties类图

1.1.2. 读取Properties配置文件比较常用的方式

1。使用java.lang.Class类的getResourceAsStream(String name)方法

InputStream in = getClass().getResourceAsStream("文件名称");

2.使用流的方式操作

InputStream in = new BufferedInputStream(new FileInputStream(filepath));

1.1.3. 缺点

1.格式必须是k=v 不能有空格。

2.不能定时刷新变化的值(比如线上环境修改值程序读取到的还是旧值)。需要自己写程序控制。

3.值都是string类型需要自己获取的时候根据需求转换。

基于上面的缺点我们可以使用org.apache.commons.configuration类解决下面是日常开发中读取properties封装。

1.1.4. commons-configuration框架的使用

1.1.4.1. maven包导入

 <dependency>
        <groupId>commons-configuration</groupId>
        <artifactId>commons-configuration</artifactId>
        <version>1.8</version>
</dependency>

1.1.4.2. 工具类封装

package cn.xhgg.common.configuration;

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.apache.commons.configuration.reloading.FileChangedReloadingStrategy;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 这个类型的配置,文件首先需要有配置文件,其次配置文件应该写入该类,再则配置文件的编码方式必须是UTF8
 */
public class PropertiesConfigUtil {
private static Logger log = LoggerFactory.getLogger(PropertiesConfigUtil.class);

public static final String PROPS_SUFFIX = ".properties";
private static Map<String, PropertiesConfiguration> configMap = new ConcurrentHashMap<String, PropertiesConfiguration>();
private static PropertiesConfiguration getConfig(String configName) {
//去除空格
configName = configName.trim();
//有后缀使用后缀 没后缀 添加后缀
String configSig = StringUtils.endsWith(configName, PROPS_SUFFIX) ? configName : configName+PROPS_SUFFIX;
if (configMap.containsKey(configSig)) {
return configMap.get(configSig);
}
PropertiesConfiguration config = null;
try {
config=new PropertiesConfiguration();
config.setEncoding("UTF-8");
config.load(configSig);
//默认五秒检查一次
config.setReloadingStrategy(new FileChangedReloadingStrategy());
config.setThrowExceptionOnMissing(true);
configMap.put(configSig, config);
} catch (ConfigurationException e) {
e.printStackTrace();
}
return config;
}
public static Map<String, String> getKeyValuePairs(String configSig) {
PropertiesConfiguration config = getConfig(configSig);
if (config == null) {
return null;
}
Iterator<String> iters = config.getKeys();
Map<String, String> retMap = new HashMap<String, String>();
while (iters.hasNext()) {
String beforeKey = iters.next();
if (retMap.containsKey(beforeKey)) {
log.warn(configSig + " configKey:" + beforeKey + " repeated!!");
}
retMap.put(beforeKey, config.getString(beforeKey));
}
return retMap;
}
/**
 * 通过PropertiesConfiguration取得参数的方法
 * <p>
 *
 * @return 。
 */
static public String getString(String configSig, String key) {
return getConfig(configSig).getString(key);
}

static public String getString(String configSig, String key, String defaultValue) {
return getConfig(configSig).getString(key, defaultValue);
}

static public int getInt(String configSig, String key) {
return getConfig(configSig).getInt(key);
}

static public int getInt(String configSig, String key, int defaultValue) {
return getConfig(configSig).getInt(key, defaultValue);
}

static public boolean getBoolean(String configSig, String key) {
return getConfig(configSig).getBoolean(key);
}

static public boolean getBoolean(String configSig, String key, boolean defaultValue) {
return getConfig(configSig).getBoolean(key, defaultValue);
}

static public double getDouble(String configSig, String key) {
return getConfig(configSig).getDouble(key);
}

static public double getDouble(String configSig, String key, double defaultValue) {
return getConfig(configSig).getDouble(key, defaultValue);
}

static public float getFloat(String configSig, String key) {
return getConfig(configSig).getFloat(key);
}

static public float getFloat(String configSig, String key, float defaultValue) {
return getConfig(configSig).getFloat(key, defaultValue);
}

static public long getLong(String configSig, String key) {
return getConfig(configSig).getLong(key);
}

static public long getLong(String configSig, String key, long defaultValue) {
return getConfig(configSig).getLong(key, defaultValue);
}

static public short getShort(String configSig, String key) {
return getConfig(configSig).getShort(key);
}

static public short getShort(String configSig, String key, short defaultValue) {
return getConfig(configSig).getShort(key, defaultValue);
}

static public List<Object> getList(String configSig, String key) {
return getConfig(configSig).getList(key);
}

static public List<Object> getList(String configSig, String key, List<Object> defaultValue) {
return getConfig(configSig).getList(key, defaultValue);
}

static public byte getByte(String configSig, String key) {
return getConfig(configSig).getByte(key);
}

static public byte getByte(String configSig, String key, byte defaultValue) {
return getConfig(configSig).getByte(key, defaultValue);
}

static public String[] getStringArray(String configSig, String key) {
return getConfig(configSig).getStringArray(key);
}
}

1.1.4.3. 引入properties测试文件

rabbitmq.properties配置如下:

#rpc 模式rmq
rpc.rabbit.host=l-opsdev3.ops.bj0.jd.com
rpc.rabbit.port=5672
rpc.rabbit.username=jd_vrmphoto
rpc.rabbit.password=jd_vrmphoto
rpc.rabbit.vhost=jd/vrmphoto
rpc.rabbit.queue=rpc_queue
rpc.rabbit.exchange=photoworker
rpc.rabbit.key=photoworker.rpc

1.1.4.4. 测试

PropertiesConfigUtil config=new PropertiesConfigUtil();
String username = config.getString("rabbitmq", "rpc.rabbit.username");
System.out.println(username);

输出结果:

jd_vrmphoto

ok,大功告成。

1.1.4.5. 注意事项

1.编码最好UTF-8统一。

ReloadingStrategy策略选择。可以看具体的实现类和使用场景。我用的一般是FileChangedReloadingStrategy类。

java操作properties配置文件的更多相关文章

  1. Java 读写Properties配置文件

    Java 读写Properties配置文件 JAVA操作properties文件 1.Properties类与Properties配置文件 Properties类继承自Hashtable类并且实现了M ...

  2. java读取properties配置文件总结

    java读取properties配置文件总结 在日常项目开发和学习中,我们不免会经常用到.propeties配置文件,例如数据库c3p0连接池的配置等.而我们经常读取配置文件的方法有以下两种: (1) ...

  3. Java读取Properties配置文件

    1.Properties类与Properties配置文件 Properties类继承自Hashtable类并且实现了Map接口,使用键值对的形式来保存属性集.不过Properties的键和值都是字符串 ...

  4. 【转】Java 读写Properties配置文件

    [转]Java 读写Properties配置文件 1.Properties类与Properties配置文件 Properties类继承自Hashtable类并且实现了Map接口,也是使用一种键值对的形 ...

  5. java读取properties配置文件信息

    一.Java Properties类 Java中有个比较重要的类Properties(Java.util.Properties),主要用于读取Java的配置文件,各种语言都有自己所支持的配置文件,配置 ...

  6. JAVA操作properties文件

    va中的properties文件是一种配置文件,主要用于表达配置信息,文件类型为*.properties,格式为文本文件,文件的内容是格式是"键=值"的格式,在properties ...

  7. Java 读取 .properties 配置文件的几种方式

    Java 开发中,需要将一些易变的配置参数放置再 XML 配置文件或者 properties 配置文件中.然而 XML 配置文件需要通过 DOM 或 SAX 方式解析,而读取 properties 配 ...

  8. java读取.properties配置文件的几种方法

    读取.properties配置文件在实际的开发中使用的很多,总结了一下,有以下几种方法(仅仅是我知道的):一.通过jdk提供的java.util.Properties类.此类继承自java.util. ...

  9. Java读取properties配置文件经常用法

    在开发中对properties文件的操作还是蛮常常的.所以总结了几种操作方法,为后面的开发能够进行參考. 1.通过java.util.ResourceBundle类来读取 这边測试用到了枚举类进行传入 ...

随机推荐

  1. if else与switch区别

    一.if-else 只是单纯地一个接一个比较:if...else每个条件都计算一遍: 二.switch 使用了Binary Tree算法:绝大部分情况下switch会快一点,除非是if-else的第一 ...

  2. Arduino抢答器

    0.部分需要掌握的知识点和注意事项 (1)面包板的结构 (2)按键的结构:按键按下时,左右两侧连通:按键松开后,左右两侧断开,但1号与2号相连,3号与4号相连,即按键松开时,同侧不相连,相连不同侧. ...

  3. Server-U FTP与AD完美集成方案详解

    最近咱有个任务,那就是把公司的文件服务器.FTP服务器.邮件服务器进行迁移并作相应的整合.登陆后台查看了,公司目前正在使用的方案.FTP服务器使用的是Server-u FTP,验证方式选择的windo ...

  4. Python开发——排队问题随机模拟分析

    案例:主要是基于"蒙特卡罗思想",求解排队等待时间问题 场景:厕所排队问题 1.两场电影结束时间相隔较长,互不影响: 2.每场电影结束之后会有20个人想上厕所: 3.这20个人会在 ...

  5. 克拉默法则(Cramer's Rule)的证明

    克拉默法则: 先说一下为什么要写这个,作为一个大一新生,必须要学的就包括了线性代数,而且线性代数等数学知识对计算机专业也有很大帮助.但是在学习过程中遇到一个讲解的不清楚的知识点(Cramer's Ru ...

  6. 智能指针之 unique_ptr

    对于动态申请的内存,C++语言为我们提供了new和delete运算符, 而没有像java一样,提供一个完整的GC机制,因此对于我们申请的动态内存, 我们需要时刻记得释放,且不能重复释放,释放后不能再去 ...

  7. 利用Bioperl的SeqIO模块解析fastq文件

    测序数据中经常会接触到fastq格式的文件,比如说拿到fastq格式的原始数据后希望查看测序碱基的质量并去除低质量碱基.一般而言大家都是用现有的工具,比如说fastqc这个Java写的小程序,确实很好 ...

  8. 第一次作业:基于Linux操作系统深入源码进程模型分析

    1.Linux操作系统的简易介绍 Linux系统一般有4个主要部分:内核.shell.文件系统和应用程序.内核.shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序.管理文件并使 ...

  9. Docker 内核名字空间

    Docker 容器和 LXC 容器很相似,所提供的安全特性也差不多.当用 docker run 启动一个容器时,在后台 Docker 为容器创建了一个独立的名字空间和控制组集合. 名字空间提供了最基础 ...

  10. Bootstrap3 表格-基本表格

    为任意 <table> 标签添加 .table 类可以为其赋予基本的样式 - 少量的内补(padding)和水平方向的分隔线.这种方式看起来很多余!?但是我们觉得,表格元素使用的很广泛,如 ...