【小工具】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解析工具,即可发至邮箱),如有需要可留言联系作者,请尊重作者时间和精力的耗费,见谅!
____________________________特此,勉励____________________________
本文作者:cheng2839
本文链接:https://www.cnblogs.com/cheng2839
关于博主:评论和私信会在第一时间回复。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/cheng2839
关于博主:评论和私信会在第一时间回复。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!