java读写properties配置文件方法
1、Properties类
Properties类表示了一个持久的属性集。Properties可保存在流中或从流中加载,属性列表中的key和value必须是字符串。
虽然Properties类继承了java.util.Hashtable,可以使用Hashtable的put等方法,但是这些方法允许使用非string类型的数据,将导致不安全的行为,所以还是应该使用setProperty 方法。
2、主要方法
load(InputStream in) 从输入流读取属性列表
getProperties(String key) 获取指定key的值,返回string
setProperty(String key, String value) 设置或修改属性的值
store(OutputStream out, String comments) 将properties对象写入一个输出流,comments为注释,comments为空则不加注释
下面进行代码演示
/*初始配置文件
aa=1
bb=2
cc=3
*/ Properties prop = new Properties(); //创建Properties对象
InputStream in = null;
FileOutputStream oFile = null;
try {
in = new FileInputStream("filePath"); //创建输入流文件对象
prop.load(in); //加载输入流
System.out.println("aa=" + prop.getProperty("aa")); //aa=1
prop.setProperty("aa", "11"); //修改"aa"的值
oFile = new FileOutputStream("filePath"); //创建输出流文件对象
prop.store(oFile, ""); //将Properties对象的属性保存到输出流指定文件
} catch (IOException e) {
log.error(e);
} finally {
try {
oFile.close(); //关闭输出流
} catch (IOException e) {
log.error(e);
}
try {
in.close(); //关闭输入流
} catch (IOException e) {
log.error(e);
}
}
最后的关闭IO流很重要,一定要放在finally代码块中执行。
3、修改properties配置文件时遇到的一些问题
读取配置文件一般不会出什么问题,修改和写入的时候稍微复杂一点,把遇到的问题记录一下
3.1 配置FileOutputStream的第二个参数true,导致配置文件末尾重复追加配置项
FileOutputStream构造函数
FileOutputStream(String name, boolean append)
append代表是否向文件末尾追加字符流的形式写入文件,默认为false,即重新写入配置
此处的输出流配置第二个参数为true会导致不停的在配置文件末尾追加重复的配置,导致输出流指定的文件越来越大。所以最好不加这个参数
/*初始配置文件
aa=1
bb=2
cc=3
*/ Properties prop = new Properties();
InputStream in = new FileInputStream("filePath");
prop.load(in);
prop.setProperty("aa", "11");
FileOutputStream oFile = new FileOutputStream("filePath", true);
prop.store(oFile, ""); /*执行后配置文件
aa=1
bb=2
cc=3 aa=11
bb=2
cc=3
*/
3.2 FileOutputStream创建位置导致诡异事情
主要是与setProperty()方法的相对位置
正常是先setProperty()设置属性,然后创建FileOutputStream对象
/*初始配置文件
aa=1
bb=2
cc=3
*/ //正常写法
InputStream in = new FileInputStream("filePath");
prop.load(in);
prop.setProperty("aa", "11");
FileOutputStream oFile = new FileOutputStream("filePath");
prop.store(oFile, ""); //问题写法
InputStream in = new FileInputStream("filePath");
FileOutputStream oFile = new FileOutputStream("filePath"); //提前创建
prop.load(in);
prop.setProperty("aa", "11");
prop.store(oFile, ""); /*正常执行后的配置文件
aa=11
bb=2
cc=3
*/ /*问题执行后的配置文件
aa=11
*/
如果反过来,会导致除setProperty()修改的属性,其它都会丢失。
没想明白这是为什么,有人明白可以指点一下。
3.3 读取和修改properties文件后改变文件内容顺序
使用jdk提供的Properties类读取和修改配置文件后,加载到内存中的顺序是随机的,不能保证和原文件的顺序一致,因此需要重写Properties类,实现顺序读取properties属性。
java读写properties配置文件方法的更多相关文章
- 【转】Java 读写Properties配置文件
[转]Java 读写Properties配置文件 1.Properties类与Properties配置文件 Properties类继承自Hashtable类并且实现了Map接口,也是使用一种键值对的形 ...
- Java 读写Properties配置文件
Java 读写Properties配置文件 JAVA操作properties文件 1.Properties类与Properties配置文件 Properties类继承自Hashtable类并且实现了M ...
- (转)Java 读写Properties配置文件
原文:http://www.cnblogs.com/xudong-bupt/p/3758136.html 1.Properties类与Properties配置文件 Properties类继承自Hash ...
- Java 读写Properties配置文件【转】
1.Properties类与Properties配置文件 Properties类继承自Hashtable类并且实现了Map接口,也是使用一种键值对的形式来保存属性集.不过Properties有特殊的地 ...
- java读取properties配置文件方法(一)
为了修改项目参数方便,需要使用properties配置文件: 首先是需要三个jar包(不同的jar包,读取配置文件的方式会有所不同,这里使用的是2.6版本的jar包) commons configur ...
- java读写properties配置文件不改变属性的顺序和注释
先贴代码 import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java ...
- Java 读写Properties配置文件(转)
转自:http://www.cnblogs.com/xudong-bupt/p/3758136.html
- java 顺序 读写 Properties 配置文件
java 顺序 读写 Properties 配置文件 支持中文 不乱码 java 顺序 读写 Properties 配置文件 ,java默认提供的Properties API 继承hashmap ,不 ...
- java 顺序 读写 Properties 配置文件 支持中文 不乱码
java 顺序 读写 Properties 配置文件 ,java默认提供的Properties API 继承hashmap ,不是顺序读写的. 特从网上查资料,顺序读写的代码,如下, import j ...
随机推荐
- java多线程——线程池源码分析(一)
本文首发于cdream的个人博客,点击获得更好的阅读体验! 欢迎转载,转载请注明出处. 通常应用多线程技术时,我们并不会直接创建一个线程,因为系统启动一个新线程的成本是比较高的,涉及与操作系统的交互, ...
- __int64 与long long 的区别
//为了和DSP兼容,TSint64和TUint64设置成TSint40和TUint40一样的数 //结果VC中还是认为是32位的,显然不合适 //typedef signed long int ...
- Redis缓存在Spring的使用
具体思路 思路很简单,就是在查询数据的时候,先检查redis数据库中有没有,要是有就把它拿出来,没有就先从mysql中取出来,再存到redis中.主要是利用aop的advisor在查mysql之前做一 ...
- c# 连等的写法都做了什么?
在工作中遇到这样一个问题,批量对变量赋值相同的值时,如下: a = ; b = ; c = ; d = ; 我想这样写: a= b = c = d = ; 分别对应IL: Dup 复制计算堆栈上当前最 ...
- 数组无法使用 forEach() 方法 - 分号的重要性
问题描述: 函数的结构如上图所示,在调用该函数的时候,浏览器报错: 分析原因: 在 js 的语法中,如果语句独占一行,通常可以省略句末的分号 但实际上 js 解析代码的时候,只有在句末缺少分号就无法正 ...
- 【机器学习】EM算法详细推导和讲解
今天不太想学习,炒个冷饭,讲讲机器学习十大算法里有名的EM算法,文章里面有些个人理解,如有错漏,还请读者不吝赐教. 众所周知,极大似然估计是一种应用很广泛的参数估计方法.例如我手头有一些东北人的身高的 ...
- 洛谷P4054 [JSOI2009]计数问题(二维树状数组)
题意 题目链接 Sol 很傻x的题.. c才100, n, m才300,直接开100个二维树状数组就做完了.. #include<bits/stdc++.h> using namespac ...
- Javascript、Jquery获取浏览器和屏幕各种高度宽度[mark]
Javascript: IE中:document.body.clientWidth ==> BODY对象宽度document.body.clientHeight ==> BODY对象高度d ...
- RaPC(rasterized polygon clipper): A discrete grid-based polygon clipping algorithm
RaPC(rasterized polygon clipper)-A discrete grid-based polygon clipping algorithm This algorithm is ...
- Android 优秀开源项目
以下是本人日常工作中收集的比较不错的Android开源项目 roottools: RootTools gives Rooted developers easy access to common roo ...