最近做的项目里需要用java修改springboot的配置文件,需要新增或修改某一个属性的值,使用了snakeyaml发现在编辑多级结构的yaml文件时,操作较为复杂,所以做了些简化,不用每次都做特殊处理,使用类似于properties文件的处理方式。
MAVEN上所需依赖。
<dependency> <groupId></groupId> <artifactId>snakeyaml</artifactId> <version>1.17</version> </dependency>
代码如下:
import ;
import ;
import .*;
import ;
import ;
import ;
/**
* @author hongweidong
* @desc 操作yaml文件的工具类
* @date 2019-01-29 20:03
*/
public class YmlUtils {
private final static DumperOptions OPTIONS = new DumperOptions();
static {
//将默认读取的方式设置为块状读取
();
}
/**
* 初始化map,将map中属性包含.的形成多级map结构,方便保存
* @param map 需要初始化的map
* @author hongweidong
*/
public static Map<String, Object> initMap(Map<String, Object> map){
Map<String, Object> result = new LinkedHashMap<String, Object>();
(map);
for (String s : ()) {
if((s) == null){
(s,"");
}
if (s.split("\\.").length > 1) {
String key[] = ("\\.");
Map<String, Object> tarMap = new LinkedHashMap<String, Object>();
for (int i = 0; i < ; i++) {
if (i == - 1) {
//最后一位
(key[i], (s));
} else {
if ((key[i]) != null) {
tarMap = (Map<String, Object>) (key[i]);
} else {
tarMap = (Map<String, Object>) (key[i]);
}
}
}
(s);
}
}
return result;
}
/**
* 测试方法
*/
public static void main(String args[]){
Map<String, Object> map = getYmlMap("F:/");
//把spring下datasoource下primary下username的值改变root
("","root");
map = initMap(map);
try {
addIntoYaml("F:/",map);
} catch (IOException e) {
();
}
("");
}
public static void addIntoYaml(String dest, Map<String, Object> map) throws IOException {
map = (map);
Yaml yaml = new Yaml(OPTIONS);
//载入当前yml文件
LinkedHashMap<String, Object> dataMap = (LinkedHashMap<String, Object>)(new FileReader(dest));
//如果yml内容为空,则会引发空指针异常,此处进行判断
if (null == dataMap) {
dataMap = new LinkedHashMap<String, Object>();
}
(map);
//将数据重新写回文件
(dataMap, new FileWriter(dest));
}
public static LinkedHashMap<String, Object> getYmlMap(String path){
File source = new File(path);
Yaml yaml = new Yaml(OPTIONS);
//载入文件
LinkedHashMap<String, Object> dataMap = null;
try {
dataMap = (LinkedHashMap<String, Object>)(new FileReader(source));
} catch (FileNotFoundException e) {
();
}
//获取当前key下的值(如果存在多个节点,则value可能为map,自行判断)
return dataMap;
}
}