Yml文件的写入和读取

Author: Lijb

Email: lijb1121@163.com

导入依赖

<dependency>
    <groupId>org.jyaml</groupId>
    <artifactId>jyaml</artifactId>
    <version>1.3</version>
</dependency>

生成yml文件格式

--- !com.neunn.monitor.web.utils.generates.rulesbean.Generates
groups: !com.neunn.monitor.web.utils.generates.rulesbean.Groups
  name: redis
  rules:
    - !com.neunn.monitor.web.utils.generates.rulesbean.Rules
      alert: redis Down
      annotations: !com.neunn.monitor.web.utils.generates.rulesbean.Annotations
        description: "{{ $labels.instance }} ---- {{ $labels.job }} Down 时间超过5s."
        summary: "Instance{{ $labels.instance }} down"
      expr: redis_up == 0
      fors: 5s
      labels: !com.neunn.monitor.web.utils.generates.rulesbean.Labels
        metricType: 1
        severity: red

Bean

public class Generates {
    private Groups groups;
}

public class Groups {
    private String name;
    private List<Rules> rules;
}

public class Rules {
    private String alert;
    private String expr;
    private String fors;
    private Labels labels;
    private Annotations annotations;
}

public class Labels {
    private String severity;
    private int metricType;
}

public class Annotations {
    private String summary;
    private String description;
}
//省略get/set方法

代码(demo)

数据时写死的假数据,yml中的数据是来自数据库的

本次业务场景:最终返回给调用者的是String字符串

考虑一个请求完成生成临时文件+读取文件格式并返回字符串,设计成AOP环绕通知

package com.neunn.monitor.web.utils.generates;

import com.neunn.monitor.web.utils.generates.rulesbean.*;
import org.ho.yaml.Yaml;
import org.junit.Test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

/**
 * 动态生成yml文件内容测试
 * [@author](https://my.oschina.net/arthor) lijb
 * [@company](https://my.oschina.net/u/3478402) 东网
 * [@date](https://my.oschina.net/u/2504391) 2019-01-08
 */


public class GenerateYml {
    //写入yaml配置文件
    [@Test](https://my.oschina.net/azibug)
    public void writeYml() {
         //初始化数据,未来数据是从数据库查出来的

        //labels
        Labels labels = new Labels();
        labels.setSeverity("red");
        labels.setMetricType(1);

        //annotations
        Annotations annotations = new Annotations();
        annotations.setSummary("Instance{{ $labels.instance }} down");
        annotations.setDescription("{{ $labels.instance }} ---- {{ $labels.job }} Down 时间超过5s.");

        //rules
        Rules rules = new Rules();
        rules.setAlert("redis Down");
        rules.setExpr("redis_up == 0");
        rules.setFors("5s");
        rules.setLabels(labels);
        rules.setAnnotations(annotations);

        List<Rules> rulesList=new ArrayList<>();
        rulesList.add(rules);

        //groups
        Groups groups = new Groups();
        groups.setRules(rulesList);
        groups.setName("redis");
        //Generates
        Generates generates= new Generates();
        generates.setGroups(groups);
        File dumpFile = new File(System.getProperty("user.dir")+"/src/com/neunn/monitor/web/utils/generates/ymlfiles/testYaml.yml");
        try {
            Yaml.dump(generates, dumpFile);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }


    //读yml文件
    @Test
    public void readYml(){
        File file = new File(System.getProperty("user.dir"), "/src/com/neunn/monitor/web/utils/generates/ymlfiles/testYaml.yml");
        try {
            // 读取文件内容 (输入流)
            FileInputStream out = new FileInputStream(file);
            InputStreamReader isr = new InputStreamReader(out);
            int ch = 0;
            StringBuilder stringBuilder = new StringBuilder();
            while ((ch = isr.read()) != -1) {
                stringBuilder.append((char) ch);
            }

            System.out.println(stringBuilder);
        } catch (Exception e) {
            // TODO: handle exception
        }
    }

}

读到的格式

--- !com.neunn.monitor.web.utils.generates.rulesbean.Generates
groups: !com.neunn.monitor.web.utils.generates.rulesbean.Groups
  name: redis
  rules: 
    - !com.neunn.monitor.web.utils.generates.rulesbean.Rules
      alert: redis Down
      annotations: !com.neunn.monitor.web.utils.generates.rulesbean.Annotations
        description: "{{ $labels.instance }} ---- {{ $labels.job }} Down 时间超过5s."
        summary: "Instance{{ $labels.instance }} down"
      expr: redis_up == 0
      fors: 5s
      labels: !com.neunn.monitor.web.utils.generates.rulesbean.Labels
        metricType: 1
        severity: red

转载于:https://my.oschina.net/u/3991887/blog/2999417

<think>好的,我现在需要解决用户的问题:如何根据数据库返回的结果动态生成或更新YML文件。用户提到了使用Java,并且参考了三个引用,我需要结合这些引用内容来构建答案。 首先,我需要理解用户的具体需求。用户想从数据库中读取数据,然后根据这些数据动态生成或修改YAML文件。引用1中的代码示例展示了如何在Java中创建一个文件路径,可能用于指定YAML文件的存储位置。引用3提到了Spring Boot中嵌入式MongoDB的配置,可能涉及数据库连接的配置。引用2关于Git push事件文件更改的检查,可能与自动化流程有关,比如在数据变化时触发生成YAML文件。 接下来,我需要整理实现步骤。大致流程应该是:连接数据库,查询数据,处理数据,生成YAML内容,写入文件。对于更新现有文件,还需要读取文件,合并数据,再写回。 然后,考虑具体技术实现。用户可能使用Spring Boot,因为引用3提到了Spring的配置。所以使用Spring Data JPA或者JDBC来连接数据库比较合适。YAML处理库可以选择SnakeYAML,这是常用的Java库。同时,需要处理文件读写操作,确保路径正确,如引用1中的例子。 关于动态更新,可能需要监听数据库变化,或者定时任务,但用户没有明确说明触发条件。引用2中的rules: changes子句可能提示在持续集成/部署环境中,当数据库变化触发某些操作,但具体实现可能需要其他机制,比如数据库触发器或应用层的事件监听。 需要注意的问题包括:数据转换的正确性,YAML格式的准确性,并发写入时的文件锁问题,以及异常处理。例如,在写入文件时,如果其他进程正在访问,可能会导致失败,需要适当的重试机制或锁控制。 然后,结合用户提供的引用内容。引用1中的文件路径构建方法可以用来确定生成的YAML文件的位置,比如在项目目录下的特定路径。引用3中的MongoDB配置可能需要从数据库读取相关配置,动态生成到YAML中,比如连接参数。引用2可能关联到自动化流程,比如当数据库数据变化时,通过Git钩子或CI/CD管道自动触发YAML生成,但具体如何结合需要更多信息,用户可能希望将生成YAML的步骤集成到部署流程中。 最后,生成相关问题,可能涉及性能优化、实时更新、版本控制等,比如如何监听数据库变化,或者如何处理大规模数据生成YAML的效率问题。</think>根据数据库结果动态生成/更新YAML文件的实现步骤如下(使用Java Spring Boot框架示例): 1. **建立数据库连接** ```java // 引用3的MongoDB配置示例 @Configuration public class MongoConfig { @Value("${spring.mongodb.embedded.version}") private String mongoVersion; // 创建MongoTemplate连接 } ``` 2. **数据查询与处理** ```java public List<ConfigItem> fetchConfigData() { return mongoTemplate.findAll(ConfigItem.class); } ``` 3. **YAML生成核心逻辑** ```java public void generateYaml(List<ConfigItem> items) { DumperOptions options = new DumperOptions(); options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); Yaml yaml = new Yaml(options); Map<String, Object> yamlData = new LinkedHashMap<>(); items.forEach(item -> yamlData.put(item.getKey(), item.getValue())); // 引用1的文件路径构建方式 File output = new File(System.getProperty("user.dir"), "/src/main/resources/application-config.yml"); try (FileWriter writer = new FileWriter(output)) { yaml.dump(yamlData, writer); } } ``` 4. **更新现有YAML文件** ```java public void updateYaml(List<ConfigItem> newItems) { File yamlFile = new File(System.getProperty("user.dir"), "/src/main/resources/application-config.yml"); Map<String, Object> existing = new LinkedHashMap<>(); if (yamlFile.exists()) { existing = yaml.load(new FileReader(yamlFile)); } newItems.forEach(item -> existing.put(item.getKey(), item.getValue())); // 写入更新后的内容 } ``` **关键注意事项:** 1. 使用SnakeYAML库进行序列化时,注意数据类型的正确转换 2. 文件路径建议采用引用1中的`System.getProperty("user.dir")`获取项目根目录 3. 更新文件时需要考虑并发写入问题,建议添加文件锁机制 4. 复杂数据结构需要特殊处理(如嵌套Map结构) 5. 可结合引用2的changes检测机制实现自动化更新[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值