如何读取properties或yml文件数据并匹配
读取properties或yml文件数据并匹配
使用springboot获取配置的文件的数据有多种方式,其中是通过注解@Value,此处通过IO获取配置文件内容。
此前已经在另外的test.xml文件中的bean中可设置xx或yy,这里实现如果test.xml文件中没有设置,可在application.*文件中进行设置。
如下:
try {
InputStream stream = getClass().getClassLoader().getResourceAsStream("application.properties");
if(stream == null){
stream = getClass().getClassLoader().getResourceAsStream("application.yml");
InputStreamReader in = new InputStreamReader(stream, "gbk");
BufferedReader reader = new BufferedReader(in);
String line;
while ((line = reader.readLine()) != null) {
if(line.trim().split(":")[0].contentEquals("xx")){
//在test.xml中读取后可通过set传值。这里也可以自己通过设置相应参数的set方法进行传值
this.setXX(line.trim().split(":")[1].trim());
}else if(line.trim().split(":")[0].contentEquals("yy")){
this.setYY(line.trim().split(":")[1].trim());
}
}
}else{
InputStreamReader in = new InputStreamReader(stream, "gbk");
BufferedReader reader = new BufferedReader(in);
String line;
while ((line = reader.readLine()) != null) {
if(line.trim().split("=")[0].contentEquals("xx")){
//在test.xml中读取后可通过set传值。这里也可以自己通过设置相应参数的set方法进行传值
this.setXX(line.trim().split(":")[1].trim());
}else if(line.trim().split("=")[0].contentEquals("yy")){
this.setYY(line.trim().split(":")[1].trim());
}
}
}
} catch (FileNotFoundException e) {
logger.error("无法找到application.*文件",e);
} catch (IOException e) {
logger.error("读取配置文件的ip或port有问题",e);
}
读取yml,properties配置文件几种方式小结
1-@value
@Value("${keys}")
private String key;
这里需要注意的是
- 当前类要交给spring来管理
- @Value不会赋值给static修饰的变量。
因为Spring的@Value依赖注入是依赖set方法,而自动生成的set方法是普通的对象方法,你在普通的对象方法里,都是给实例变量赋值的,不是给静态变量赋值的,static修饰的变量,一般不生成set方法。若必须给static修饰的属性赋值可以参考以下方法
private static String url;
// 记得去掉static
@Value("${mysql.url}")
public void setDriver(String url) {
JdbcUtils.url= url;
}
但是该方案有个弊端,数组应该如何注入呢?
2-使用对象注入
auth:
clients:
- id:1
password: 123
- id: 2
password: 123
@Component
@ConfigurationProperties(prefix="auth")
public class IgnoreImageIdConfig {
private List<Map<String,String>> clients =new ArrayList<Integer>();
}
利用配置Javabean的形式来获得值,值得注意的是,对象里面的引用名字(‘clients'),必须和yml文件中的(‘clients')一致,不然就会取不到数据,另外一点是,数组这个对象必须先new出来,如果没有对象的话也会取值失败的,(同理map形式也必须先将map对应的对象new出来)。
3-读取配置文件
private static final String FILE_PATH = "classpath:main_data_sync.yml";
static Map<String, String> result = null;
private static Properties properties = null;
private YmlUtil() {
}
/**
* 读取yml的配置文件数据
* @param filePath
* @param keys
* @return
*/
public static Map<String, String> getYmlByFileName(String filePath, String... keys) {
result = new HashMap<>(16);
if (filePath == null) {
filePath = FILE_PATH;
}
InputStream in = null;
File file = null;
try {
file = ResourceUtils.getFile(filePath);
in = new BufferedInputStream(new FileInputStream(file));
Yaml props = new Yaml();
Object obj = props.loadAs(in, Map.class);
Map<String, Object> param = (Map<String, Object>) obj;
for (Map.Entry<String, Object> entry : param.entrySet()) {
String key = entry.getKey();
Object val = entry.getValue();
if (keys.length != 0 && !keys[0].equals(key)) {
continue;
}
if (val instanceof Map) {
forEachYaml(key, (Map<String, Object>) val, 1, keys);
} else {
String value = val == null ? null : JSONObject.toJSONString(val);
result.put(key, value);
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return result;
}
public static Map<String, String> forEachYaml(String keyStr, Map<String, Object> obj, int i, String... keys) {
for (Map.Entry<String, Object> entry : obj.entrySet()) {
String key = entry.getKey();
Object val = entry.getValue();
if (keys.length > i && !keys[i].equals(key)) {
continue;
}
String strNew = "";
if (StringUtils.isNotEmpty(keyStr)) {
strNew = keyStr + "." + key;
} else {
strNew = key;
}
if (val instanceof Map) {
forEachYaml(strNew, (Map<String, Object>) val, ++i, keys);
i--;
} else {
String value = val == null ? null : JSONObject.toJSONString(val);
result.put(strNew, value);
}
}
return result;
}
/**
* 获取Properties类型属性值
* @param filePath classpath:文件名
* @param key key值
* @return
* @throws IOException
*/
public static String getProperties(String filePath,String key) throws IOException {
if (properties == null) {
Properties prop = new Properties();
//InputStream in = Util.class.getClassLoader().getResourceAsStream("testUrl.properties");
InputStream in = new BufferedInputStream(new FileInputStream(ResourceUtils.getFile(filePath))) ;
prop.load(in);
properties = prop;
}
return properties.getProperty(key);
}
public static void main(String[] args) {
/*Map<String, String> cId = getYmlByFileName("classpath:test.yml", "auth", "clients");
//cId.get("")
String json = cId.get("auth.clients");
List<Map> maps = JSONObject.parseArray(json, Map.class);
System.out.println(maps);*/
try {
String properties = getProperties("classpath:test.properties", "fileServerOperator.beanName");
System.out.println(properties);
} catch (IOException e) {
e.printStackTrace();
}
}
auth: #认证
clients:
- id: 1
secretKey: ba2631ee44149bbe #密钥key
- id: 2
secretKey: ba2631ee44149bbe #密钥key
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
Java实现读取Excel文件功能(EasyExcel初使用)
EasyExcel是一款基于Java语言的开源Excel解析工具,可以帮助我们快速、高效地读取和写入Excel文件,这篇文章主要给大家介绍了关于Java实现读取Excel文件功能的相关资料,使用的是EasyExcel,需要的朋友可以参考下2024-07-07
Hibernate Validation自定义注解校验的实现
这篇文章主要介绍了Hibernate Validation自定义注解校验的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2019-04-04
SpringBoot使用Redis Stream实现轻量消息队列的示例代码
Redis Stream 是 Redis 5.0 引入的一种数据结构,用于处理日志类型的数据,它提供了高效、可靠的方式来处理和存储时间序列数据,如事件、消息等,本文介绍了SpringBoot使用Redis Stream实现轻量消息队列,需要的朋友可以参考下2024-08-08
Spring Boot 各种回滚操作实战教程(自动回滚、手动回滚、部分回滚)
这篇文章主要介绍了Spring Boot 各种回滚操作实战教程(自动回滚、手动回滚、部分回滚),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2023-07-07
java开发hutool HttpUtil网络请求工具使用demo
这篇文章主要为大家介绍了hutool之HttpUtil网络请求工具使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-07-07
java向es中写入数据报错org.elasticsearch.action.ActionReque问题
这篇文章主要介绍了java向es中写入数据报错org.elasticsearch.action.ActionReque问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2023-11-11


最新评论