【小工具】yml文件解析器

闲来无事,自己写了一个yml文件解析器

有什么作用呢?我的初步想法是java swing组件的可配置化,节省代码量和工作量。

直接上代码:

1. 先写一个基础公共类Base.java

 1 package com.clb.test.ymlparser.model;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 public final class Base {
 7     public static final String FLAG_REMARK = "#";
 8     public static final String FLAG_SEP_K_V = ":";
 9 
10     public static List<List<String>> roots(List<String> ymlFile) {
11         List<List<String>> childrenConfigList = new ArrayList<>();
12         List<String> nextLines = null;
13         for (String line : ymlFile) {
14             if (Base.isBlank(line) || line.trim().startsWith(Base.FLAG_REMARK)) {
15                 continue;
16             }
17             if (Base.headSpaceCount(line) == 0) {
18                 if (nextLines != null && !nextLines.isEmpty()) {
19                     childrenConfigList.add(new ArrayList<>(nextLines));
20                 }
21                 nextLines = new ArrayList<>();
22             }
23             nextLines.add(line);
24         }
25         childrenConfigList.add(new ArrayList<>(nextLines));
26         return childrenConfigList;
27     }
28 
29     public static boolean isBlank(String s) {
30         return null == s || "".equals(s.trim());
31     }
32 
33     public static int headSpaceCount(String s) {
34         int c = 0;
35         for (int i = 0; s != null && i < s.length(); i++) {
36             if (s.charAt(i) == 32) {
37                 c++;
38             } else {
39                 break;
40             }
41         }
42         return c;
43     }
44 
45     public static String parseKey(String s) {
46         if (s.indexOf(FLAG_SEP_K_V) > 0) {
47             String[] vs = s.split(FLAG_SEP_K_V);
48             return vs[0].trim();
49         }
50         return null;
51     }
52 
53     public static String parseValue(String s) {
54         if (isBlank(parseKey(s)) || s.trim().endsWith(FLAG_SEP_K_V)) {
55             return null;
56         }
57         return s.substring(s.indexOf(FLAG_SEP_K_V) + 1).trim();
58     }
59 }

2. 下面是核心:Item类,用于表示一个yml文件配置的项

 3. myfest.yml测试文件

 1 spring:
 2   application:
 3   # 服务名称
 4     name: mytest
 5   cloud:
 6     config:
 7       discovery:
 8         enabled: true
 9         serviceId: config
10       profile: ${spring.profiles.active}
11       password: cheng2839
12       username: admin
13       label: master
14       name: mytest
15 eureka:
16   instance:
17     prefer-ip-address: true
18     instance-id: ${spring.cloud.client.ipAddress}:${server.port}
19   client:
20     service-url:
21     # eureka 注册中心地址
22       defaultZone: http://127.0.0.1:8889/eureka
23 
24 server:
25   context-path: /
26 
27 feign:
28   client:
29     config:
30       default:
31         connect-timeout: 20000
32         read-timeout: 30000
33       service-test:
34         connect-timeout: 20000
35         read-timeout: 30000
36   hystrix:
37     enabled: false

 

4. 测试类:YmlParser.java

package com.clb.test.ymlparser;

import com.clb.test.ymlparser.model.Base;
import com.clb.test.ymlparser.model.Item;

import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.List;

/**
 * @Description yml configuration file parser
 * @Author cheng
 * @Date   2021年2月7日
 * @Version v1.0
 */
public class YmlParser {

    public static void main(String[] args) throws IOException {
        String filePath = YmlParser.class.getResource("myfest.yml").getPath();
        List<String> ymlFile = read(new File(filePath));

        List<Item> rootItems = new ArrayList<>();
        Base.roots(ymlFile).forEach(e -> rootItems.add(new Item(e, null)));

        iterator(rootItems);
    }

    public static void iterator(List<Item> items) {
        if (items == null || items.isEmpty())
            return;
        for (Item item : items) {
            if (item.isLeaf()) {
                System.out.println(item.getKey() + " : " + item.getValue());
            }
            iterator(item.getChildren());
        }
    }

    public static List<String> read(File file) throws IOException {
        return Files.readAllLines(file.toPath(), StandardCharsets.UTF_8);
    }
}

控制台打印结果如下:

spring.application.name : mytest
spring.cloud.config.discovery.enabled : true
spring.cloud.config.discovery.serviceId : config
spring.cloud.config.profile : ${spring.profiles.active}
spring.cloud.config.password : cheng2839
spring.cloud.config.username : admin
spring.cloud.config.label : master
spring.cloud.config.name : mytest
eureka.instance.prefer-ip-address : true
eureka.instance.instance-id : ${spring.cloud.client.ipAddress}:${server.port}
eureka.client.service-url.defaultZone : http://127.0.0.1:8889/eureka
server.context-path : /
feign.client.config.default.connect-timeout : 20000
feign.client.config.default.read-timeout : 30000
feign.client.config.service-test.connect-timeout : 20000
feign.client.config.service-test.read-timeout : 30000
feign.hystrix.enabled : false

 

备注:该类无法直接使用,因为此为作者原创,版权原因(需要付费1元,备注yml解析工具,即可发至邮箱),如有需要可留言联系作者,请尊重作者时间和精力的耗费,见谅!

 

 

posted @ 2021-02-08 11:32  温柔的星空,让你感动  阅读(344)  评论(0编辑  收藏  举报