通过JAVA代码对yaml文件进行增加、修改的操作

近期有个需求,需要通过java代码对yaml文件进行修改或新增,对pom.xml文件进行添加依赖或者删除依赖。

首先介绍对yaml文件的操作:

1.需要引入jar包:

<dependency>
    <groupId>org.yaml</groupId>
    <artifactId>snakeyaml</artifactId>
</dependency>

2.在class文件中,需要添加一下属性:

private static DumperOptions dumperOptions = new DumperOptions();
static{
    //设置yaml读取方式为块读取
    dumperOptions.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
    dumperOptions.setDefaultScalarStyle(DumperOptions.ScalarStyle.PLAIN);
    dumperOptions.setPrettyFlow(false);
}

具体作用是为了生成出的yaml格式(详细作用可百度),注意:该方法相当于重新生成yaml文件,原yaml文件中的注释会消失,暂未找到解决方法。

update方法:

public boolean updateYaml(String url, String paramKey, Object paramValue) {
Yaml yaml = new Yaml(dumperOptions);
//yaml文件路径
String yamlUr = url + yamlUrl;
Map map = null;
try {
    //将yaml文件加载为map格式
    map = yaml.loadAs(new FileInputStream(yamlUr), Map.class);
} catch (FileNotFoundException e) {
    e.printStackTrace();
}
//获取当前参数值并且修改
boolean flag = updateYaml(paramKey, paramValue, map, yamlUr, yaml);
return flag;
}
/**
 * 修改yaml中属性的值
 *
 * @param key      key是properties的方式: aaa.bbb.ccc (key不存在不修改)
 * @param value    新的属性值 (新属性值和旧属性值一样,不修改)
 * @param yamlToMap map结构
 * @param path 路径
 * @return true 修改成功,false 修改失败。
 */
public boolean updateYaml(String key, Object value, Map<String, Object> yamlToMap, String path, Yaml yaml) {
    Object oldVal = getValue(key, yamlToMap);
    //未找到key 不修改
    if (null == oldVal) {
        return false;
    }

    try {
        Map<String, Object> resultMap = setValue(yamlToMap, key, value);
        if (resultMap != null) {
            yaml.dump(resultMap, new FileWriter(path));
            return true;
        } else {
            return false;
        }
    } catch (Exception e) {
        System.out.println("yaml file update failed !");
    }
    return false;
}
/**
 * key格式:aaa.bbb.ccc
 * 通过properties的方式获取yaml中的属性值
 *
 * @param key
 * @param yamlMap
 * @return
 */
public Object getValue(String key, Map<String, Object> yamlMap) {
    String[] keys = key.split("[.]");
    Object o = yamlMap.get(keys[0]);
    if (key.contains(".")) {
        if (o instanceof Map) {
            return getValue(key.substring(key.indexOf(".") + 1), (Map<String, Object>) o);
        } else {
            return null;
        }
    } else {
        return o;
    }
}
/**
 * 修改yaml中的属性值
 */
public Map<String, Object> setValue(Map<String, Object> map, String key, Object value) {
    String[] keys = key.split("\\.");

    int len = keys.length;
    Map temp = map;
    for (int i = 0; i < len - 1; i++) {
        if (temp.containsKey(keys[i])) {
            temp = (Map) temp.get(keys[i]);
        } else {
            return null;
        }
        if (i == len - 2) {
            temp.put(keys[i + 1], value);
        }
    }
    for (int j = 0; j < len - 1; j++) {
        if (j == len - 1) {
            map.put(keys[j], temp);
        }
    }
    return map;
}

对yaml文件进行新增方法:

public boolean insertYaml(String key, Object value, Map<String, Object> yamlToMap, String path) {

    Yaml yaml = new Yaml(dumperOptions);
    String[] keys = key.split("\\.");

    int len = keys.length;
    Map temp = yamlToMap;

    for (int i = 0; i < len; i++) {
        if (temp.containsKey(keys[i])) {
            temp = (Map) temp.get(keys[i]);
        } else {
            //该处对yaml的层级需要有判断,可能有问题
            if(i + 2 == len){
                Map<String, Object> newMap = new HashMap<>();
                newMap.put(keys[len-1],value);
                temp.put(keys[i],newMap);
                break;
            }else {
                temp.put(keys[i], value);
                break;
            }
        }
    }
    try {
        yaml.dump(yamlToMap, new FileWriter(path));
    } catch (Exception e) {
        System.out.println("yaml file insert failed !");
        return false;
    }
    return true;
}

对yaml文件中的字段进行删除同样可以做到,具体功能没有实现。

对xml文件的操作在另一篇文章:https://blog.csdn.net/qq_44843880/article/details/107937431

可以使用Java中的Jackson库和OpenCSV库来实现将YAML文件转换成CSV文件的功能。 首先,需要在项目中引入以下两个依赖: ```xml <dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-yaml</artifactId> <version>2.12.4</version> </dependency> <dependency> <groupId>com.opencsv</groupId> <artifactId>opencsv</artifactId> <version>5.5.2</version> </dependency> ``` 接下来,可以编写以下代码: ```java import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; import com.opencsv.CSVWriter; import java.io.File; import java.io.FileWriter; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; public class YamlToCsvConverter { public static void main(String[] args) throws Exception { // 读取YAML文件 ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); Map<String, Object> yamlData = mapper.readValue(new File("data.yaml"), Map.class); // 转换成List<List<String>>形式的数据 List<List<String>> csvData = new ArrayList<>(); for (Object value : yamlData.values()) { if (value instanceof List) { List<?> list = (List<?>) value; List<String> row = new ArrayList<>(); for (Object item : list) { row.add(item.toString()); } csvData.add(row); } } // 写入CSV文件 CSVWriter writer = new CSVWriter(new FileWriter("data.csv")); writer.writeAll(csvData); writer.close(); } } ``` 在以上代码中,首先使用Jackson库读取YAML文件,然后将YAML数据转换成List<List<String>>形式的数据。最后使用OpenCSV库将数据写入CSV文件中。需要注意的是,以上代码只能处理YAML文件中的列表数据(List),如果需要处理其他类型的数据,需要进行修改
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值