Properties文件工具类的使用--获取所有的键值、删除键、更新键等操作
有时候我们希望处理properties文件,properties文件是键值对的文件形式,我们可以借助Properties类操作。
工具类如下:(代码中日志采用了slf4j日志)
package cn.xm.exam.utils; import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Map.Entry;
import java.util.Properties; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; /**
* 操作properties文件的工具类(此工具类的file都是src目录下的properties文件,编译之后在build目录下)
*
* @author QiaoLiQiang
* @time 2018年11月3日下午12:05:32
*/
public class PropertiesFileUtils {
private static final Logger log = LoggerFactory.getLogger(PropertiesFileUtils.class); /**
* 构造函数私有化
*/
private PropertiesFileUtils() { } /**
* 保存或更新properties文件中的key
*
* @param fileName
* @param key
* @param value
*/
public static void saveOrUpdateProperty(String fileName, String key, String value) {
Properties properties = new Properties();
InputStream inputStream;
OutputStream outputStream;
try {
String path = ResourcesUtil.class.getClassLoader().getResource(fileName).getPath();
log.debug("path -> {}", path);
inputStream = new FileInputStream(new File(path));
properties.load(inputStream);
properties.setProperty(key, value); // 保存到文件中(如果有的话会自动更新,没有会创建)
outputStream = new FileOutputStream(new File(path));
properties.store(outputStream, ""); outputStream.close();
inputStream.close();
} catch (FileNotFoundException e) {
log.error("saveOrUpdateProperty error", e);
} catch (IOException e) {
log.error("saveOrUpdateProperty error", e);
}
} /**
* 获取Properties
*
* @param fileName
* @param key
* @return
*/
public static String getPropertyValue(String fileName, String key) {
Properties properties = new Properties();
InputStream inputStream;
String value = "";
try {
String path = PropertiesFileUtils.class.getClassLoader().getResource(fileName).getPath();
log.info("path -> {}", path);
inputStream = new FileInputStream(new File(path));
properties.load(inputStream); value = properties.getProperty(key);
// 保存到文件中(如果有的话会自动更新,没有会创建)
inputStream.close();
} catch (FileNotFoundException e) {
log.error("saveOrUpdateProperty error", e);
} catch (IOException e) {
log.error("saveOrUpdateProperty error", e);
}
return value;
} /**
* 获取Properties
*
* @param fileName
* @return
*/
public static Properties getProperties(String fileName) {
Properties properties = new Properties();
InputStream inputStream;
try {
String path = PropertiesFileUtils.class.getClassLoader().getResource(fileName).getPath();
log.info("path -> {}", path);
inputStream = new FileInputStream(new File(path));
properties.load(inputStream); inputStream.close();
} catch (FileNotFoundException e) {
log.error("saveOrUpdateProperty error", e);
} catch (IOException e) {
log.error("saveOrUpdateProperty error", e);
}
return properties;
} /**
* 获取Properties
*
* @param fileName
* @return
*/
public static Properties removeProperty(String fileName, String key) {
Properties properties = new Properties();
InputStream inputStream;
OutputStream outputStream;
try {
String path = PropertiesFileUtils.class.getClassLoader().getResource(fileName).getPath();
log.info("path -> {}", path);
inputStream = new FileInputStream(new File(path));
properties.load(inputStream);
log.info("properties -> {}", properties);
if (properties != null && properties.containsKey(key)) {
log.info("remove key:{}", key);
properties.remove(key);
} // 保存到文件中(将properties保存到文件)
outputStream = new FileOutputStream(new File(path));
properties.store(outputStream, ""); outputStream.close();
inputStream.close();
} catch (FileNotFoundException e) {
log.error("saveOrUpdateProperty error", e);
} catch (IOException e) {
log.error("saveOrUpdateProperty error", e);
}
return properties;
} public static void main(String[] args) {
// 保存三个 最后一个相当于更新
PropertiesFileUtils.saveOrUpdateProperty("settings.properties", "a", "aaa");
PropertiesFileUtils.saveOrUpdateProperty("settings.properties", "b", "bbb");
PropertiesFileUtils.saveOrUpdateProperty("settings.properties", "c", "ccc");
PropertiesFileUtils.saveOrUpdateProperty("settings.properties", "a", "AAA"); // 获取所有的properties
Properties properties = PropertiesFileUtils.getProperties("settings.properties");
System.out.println(properties); // 删除a
PropertiesFileUtils.removeProperty("settings.properties", "a"); // 获取所有的properties
Properties properties1 = PropertiesFileUtils.getProperties("settings.properties");
System.out.println(properties1);
} }
结果:
{b=bbb, a=AAA, c=ccc}
{b=bbb, c=ccc}
解释:
Properties是继承了HashTable的一个普通类,所以我们可以简单的认为操作Properties就是在操作HashTable。
public
class Properties extends Hashtable<Object,Object> { private static final long serialVersionUID = 4112578634029874840L; protected Properties defaults;
。。。
}
由于HasTable键不可以重复,所以我们在saveOrUpdateProperty中直接setProperty的时候如果没有key会创建key,如果key存在会覆盖原来的值。
properties.load(inputStream);是将properties文件中的key=value的数据加载到properties中;
properties.store(outputStream, "");是将properties保存到一个文件中。
补充:上面代码还可以进一步将properties文件的位置封装全路径:
package cn.xm.exam.utils; import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Properties; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; /**
*
* @author QiaoLiQiang
* @time 2018年11月3日下午12:05:32
*/
public class PropertiesFileUtils {
private static final Logger log = LoggerFactory.getLogger(PropertiesFileUtils.class); /**
* 构造函数私有化
*/
private PropertiesFileUtils() { } /**
* 保存或更新properties文件中的key
*
* @param fileName
* @param key
* @param value
*/
public static void saveOrUpdateProperty(String fileName, String key, String value) {
Properties properties = new Properties();
InputStream inputStream;
OutputStream outputStream;
try {
String path = ResourcesUtil.class.getClassLoader().getResource(fileName).getPath();
log.debug("path -> {}", path);
inputStream = new FileInputStream(new File(path));
properties.load(inputStream);
properties.setProperty(key, value); // 保存到文件中(如果有的话会自动更新,没有会创建)
outputStream = new FileOutputStream(new File(path));
properties.store(outputStream, ""); outputStream.close();
inputStream.close();
} catch (FileNotFoundException e) {
log.error("saveOrUpdateProperty error", e);
} catch (IOException e) {
log.error("saveOrUpdateProperty error", e);
}
} /**
* 获取Properties
*
* @param fileName
* @param key
* @return
*/
public static String getPropertyValue(String fileName, String key) {
Properties properties = new Properties();
InputStream inputStream;
String value = "";
try {
String path = PropertiesFileUtils.class.getClassLoader().getResource(fileName).getPath();
log.info("path -> {}", path);
inputStream = new FileInputStream(new File(path));
properties.load(inputStream); value = properties.getProperty(key);
// 保存到文件中(如果有的话会自动更新,没有会创建)
inputStream.close();
} catch (FileNotFoundException e) {
log.error("saveOrUpdateProperty error", e);
} catch (IOException e) {
log.error("saveOrUpdateProperty error", e);
}
return value;
} /**
* 获取Properties
*
* @param fileName
* @return
*/
public static Properties getProperties(String fileName) {
Properties properties = new Properties();
InputStream inputStream;
try {
String path = PropertiesFileUtils.class.getClassLoader().getResource(fileName).getPath();
log.info("path -> {}", path);
inputStream = new FileInputStream(new File(path));
properties.load(inputStream); inputStream.close();
} catch (FileNotFoundException e) {
log.error("saveOrUpdateProperty error", e);
} catch (IOException e) {
log.error("saveOrUpdateProperty error", e);
}
return properties;
} /**
* 获取Properties
*
* @param fileName
* @return
*/
public static Properties removeProperty(String fileName, String key) {
Properties properties = new Properties();
InputStream inputStream;
OutputStream outputStream;
try {
String path = PropertiesFileUtils.class.getClassLoader().getResource(fileName).getPath();
log.info("path -> {}", path);
inputStream = new FileInputStream(new File(path));
properties.load(inputStream);
log.info("properties -> {}", properties);
if (properties != null && properties.containsKey(key)) {
log.info("remove key:{}", key);
properties.remove(key);
} // 保存到文件中(将properties保存到文件)
outputStream = new FileOutputStream(new File(path));
properties.store(outputStream, ""); outputStream.close();
inputStream.close();
} catch (FileNotFoundException e) {
log.error("saveOrUpdateProperty error", e);
} catch (IOException e) {
log.error("saveOrUpdateProperty error", e);
}
return properties;
} /**
* 保存或更新properties文件中的key
*
* @param path
* 文件全路径
* @param key
* @param value
*/
public static void saveOrUpdatePropertyByFilePath(String path, String key, String value) {
Properties properties = new Properties();
InputStream inputStream;
OutputStream outputStream;
try {
log.debug("path -> {}", path);
inputStream = new FileInputStream(new File(path));
properties.load(inputStream);
properties.setProperty(key, value); // 保存到文件中(如果有的话会自动更新,没有会创建)
outputStream = new FileOutputStream(new File(path));
properties.store(outputStream, ""); outputStream.close();
inputStream.close();
} catch (FileNotFoundException e) {
log.error("saveOrUpdateProperty error", e);
} catch (IOException e) {
log.error("saveOrUpdateProperty error", e);
}
} /**
* 获取Properties
*
* @param path
* 文件全路径
* @param key
* @return
*/
public static String getPropertyValueByFilePath(String path, String key) {
Properties properties = new Properties();
InputStream inputStream;
String value = "";
try {
log.info("path -> {}", path);
inputStream = new FileInputStream(new File(path));
properties.load(inputStream); value = properties.getProperty(key);
// 保存到文件中(如果有的话会自动更新,没有会创建)
inputStream.close();
} catch (FileNotFoundException e) {
log.error("saveOrUpdateProperty error", e);
} catch (IOException e) {
log.error("saveOrUpdateProperty error", e);
}
return value;
} /**
* 获取Properties
*
* @param path
* 文件全路径
* @return
*/
public static Properties getPropertiesByFilePath(String path) {
Properties properties = new Properties();
InputStream inputStream;
try {
log.info("path -> {}", path);
inputStream = new FileInputStream(new File(path));
properties.load(inputStream); inputStream.close();
} catch (FileNotFoundException e) {
log.error("saveOrUpdateProperty error", e);
} catch (IOException e) {
log.error("saveOrUpdateProperty error", e);
}
return properties;
} /**
* 获取Properties
*
* @param path
* 文件全路径
* @param key
* key值
* @return
*/
public static Properties removePropertyByFilePath(String path, String key) {
Properties properties = new Properties();
InputStream inputStream;
OutputStream outputStream;
try {
log.info("path -> {}", path);
inputStream = new FileInputStream(new File(path));
properties.load(inputStream);
log.info("properties -> {}", properties);
if (properties != null && properties.containsKey(key)) {
log.info("remove key:{}", key);
properties.remove(key);
} // 保存到文件中(将properties保存到文件)
outputStream = new FileOutputStream(new File(path));
properties.store(outputStream, ""); outputStream.close();
inputStream.close();
} catch (FileNotFoundException e) {
log.error("saveOrUpdateProperty error", e);
} catch (IOException e) {
log.error("saveOrUpdateProperty error", e);
}
return properties;
}
}
补充:如果是spring项目读取jar包中的配置可以用 ClassPathResource 进行读取:
/**
* 获取文件中对应的key的名称
*
* @param fileName
* @param key
* @return
*/
public static String getPropertyValue(String fileName, String key) {
Properties properties = new Properties();
InputStream inputStream = null;
String value = ""; try {
ClassPathResource resource = new ClassPathResource(fileName);
inputStream = resource.getInputStream();
properties.load(inputStream);
value = properties.getProperty(key);
} catch (Exception e) {
log.error("saveOrUpdateProperty error", e);
} finally {
IOUtils.closeQuietly(inputStream);
} return value;
}
补充:由于springboot打成jar包之后里面的文件不能实时修改,所以在当前程序的主目录下创建一settings.properties文件进行操作
package cn.qs.utils.system; import java.io.File;
import java.io.IOException;
import java.util.Date; import javax.servlet.http.HttpServletRequest; import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.SystemUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes; import cn.qs.bean.user.User;
import cn.qs.utils.UUIDUtils;
import cn.qs.utils.file.PropertiesFileUtils; public class MySystemUtils { private static final Logger LOGGER = LoggerFactory.getLogger(MySystemUtils.class); static {
checkSettingPropertyFiles();
} private MySystemUtils() {
} /**
* 检查settings.properties文件是否存在,不存在就创建
*/
public static void checkSettingPropertyFiles() {
File userDir = SystemUtils.getUserDir();
File propertiesFile = new File(userDir, "settings.properties");
if (!propertiesFile.exists()) {
try {
propertiesFile.createNewFile();
LOGGER.info("create settings.properties success, path: {}", propertiesFile.getAbsolutePath());
} catch (IOException e) {
LOGGER.error("create settings.properties failed", e);
}
}
} public static final String settings_file_path = SystemUtils.getUserDir().getAbsolutePath() + "/settings.properties"; public static String getProductName() {
return getProperty("productName", "管理网");
} public static String getProperty(String key) {
return getProperty(key, "");
} public static String getProperty(String key, String defaultValue) {
return StringUtils.defaultIfBlank(PropertiesFileUtils.getPropertyValueByFilePath(settings_file_path, key),
defaultValue);
} public static void setProperty(String key, Object value) {
PropertiesFileUtils.saveOrUpdatePropertyByFilePath(settings_file_path, key, String.valueOf(value));
} }
SystemUtils.getUserDir()方法获取的是项目所在的路径,如果是springboot打的jar包是jar包所在的目录。
Properties文件工具类的使用--获取所有的键值、删除键、更新键等操作的更多相关文章
- Property工具类,Properties文件工具类,PropertiesUtils工具类
Property工具类,Properties文件工具类,PropertiesUtils工具类 >>>>>>>>>>>>>& ...
- Java读取properties文件工具类并解决控制台中文乱码
1.建立properts文件(error.message.properties) HTTP201= 请求成功并且服务器创建了新的资源 2.在spring-mvc.xml文件(applicationCo ...
- 读取Properties文件工具类
import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java ...
- 加载Properties文件工具类:LoadConfig
import javax.servlet.http.HttpServletRequest; import javax.ws.rs.GET; import javax.ws.rs.Path; impor ...
- 我的Java开发学习之旅------>工具类:Java获取字符串和文件进行MD5值
ps:这几天本人用百度云盘秒传了几部大片到云盘上,几个G的文件瞬秒竟然显示"上传成功"!这真让我目瞪口呆,要是这样的话,那得多快的网速,这绝对是不可能的,也许这仅是个假象.百度了一 ...
- 读取Config文件工具类 PropertiesConfig.java
package com.util; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io ...
- Android FileUtil(android文件工具类)
android开发和Java开发差不了多少,也会有许多相同的功能.像本文提到的文件存储,在Java项目和android项目里面用到都是相同的.只是android开发的一些路径做了相应的处理. 下面就是 ...
- Java常用工具类---IP工具类、File文件工具类
package com.jarvis.base.util; import java.io.IOException;import java.io.InputStreamReader;import jav ...
- java下载文件工具类
java下载文件工具类 package com.skjd.util; import java.io.BufferedInputStream; import java.io.BufferedOutput ...
随机推荐
- AJAX--总结
AJAX 2018-9-6 14:42:53 AJAX简介 HTTP协议------>HTTP权威指南 请求:客户端去向服务端请求一个文件 响应:服务端把对应的文件内容返回给客户端, ...
- day14 闭包
闭包的概念 必须要有函数嵌套,内部函数调用外部函数的变量 简单的例子 此种方法会导致每次使用内部函数inner的时候需要不断的调用外部函数. 结果导致外部函数的变量不断的被调用被释放,比较低效,相当于 ...
- Java“禁止”泛型数组
Java“禁止”泛型数组 原文:https://blog.csdn.net/yi_Afly/article/details/52058708 1. 泛型定义泛型编程是一种通过参数化的方式将数据处理与数 ...
- pycharm同级目录导入问题
在PyCharm2017中同目录下import其他模块,会出现No model named ...的报错,但实际可以运行 这是因为PyCharm不会将当前文件目录自动加入source_path. 在当 ...
- mysql中存储过程
存储过程procedure 存储过程,其本质还是函数——但其规定:不能有返回值: 定义形式: 说明: 1,in:用于设定该变量是用来“接收实参数据”的,即“传入”:默认不写,就是in 2,out:用于 ...
- 【ZJOI 2019】麻将(dp of dp)
这是我第一次写$dp \; of \; dp$,大致思路参考了xyx的做法,可能有些地方不太一样,但也许会详细一点. 考虑给你一副牌,如何判断这副牌是否是胡的. 容易发现相同的顺子不会选三个以上,于是 ...
- 字符串格式化format方法
通过位置参数传参 print('{}, {}'.format('KeithTt', 18)) # KeithTt, 18 位置参数可以通过索引调用 print('{1}, {0}'.format('K ...
- Mysql服务器处理客户端请求流程
在日常执行mysql语句的过程中,都是客户端进程向服务器进程发送一段文本(MySQL语句),服务器进程处理后再向客户端进程发送一段文本(处理结果). 看似很简单,其实不然,这内容有很多东西是需要注意的 ...
- [luogu1655][小朋友的球]
luogu1665 思路 一道第二类斯特兰数的模板题.只不过需要写个高精. f[i][j]表示前i个球放到j个盒子里的方案数.第i个球可以单独一个盒子,所以f[i][j]+=f[i-1][j-1].还 ...
- python并发编程之IO模型 (四十九)
IO模型介绍 http://www.cnblogs.com/linhaifeng/articles/7454717.html