当前位置: 首页 > news >正文

网站的根目录下是哪个文件夹济南计算机培训机构哪个最好

网站的根目录下是哪个文件夹,济南计算机培训机构哪个最好,网站建站加盟,专业网站建设明细报价表使用Java将properties转为yaml 一 前言1.1 顺序错乱的原因1.2 遗漏子节点的原因 二、优化措施三、源码 一 前言 浏览了一圈网上的版本#xff0c;大多存在以下问题#xff1a; 转换后顺序错乱遗漏子节点 基于此进行了优化#xff0c;如果只是想直接转换#xff0c;可直接… 使用Java将properties转为yaml 一 前言1.1 顺序错乱的原因1.2 遗漏子节点的原因 二、优化措施三、源码 一 前言 浏览了一圈网上的版本大多存在以下问题 转换后顺序错乱遗漏子节点 基于此进行了优化如果只是想直接转换可直接使用我发布的 在线版本 如果想在工程中使用可继续往下看源码在文末。 1.1 顺序错乱的原因 大部分代码都是使用了java.util.Properties类来转换这个类是基于ConcurrentHashMap来存储键值对的必然会顺序错乱 这是截取的Properties类的部分源码 /*** Properties does not store values in its inherited Hashtable, but instead* in an internal ConcurrentHashMap. Synchronization is omitted from* simple read operations. Writes and bulk operations remain synchronized,* as in Hashtable.*/ private transient volatile ConcurrentHashMapObject, Object map;/*** Creates an empty property list with the specified defaults.** implNote The initial capacity of a {code Properties} object created* with this constructor is unspecified.** param defaults the defaults.*/ public Properties(Properties defaults) {this(defaults, 8); }private Properties(Properties defaults, int initialCapacity) {// use package-private constructor to// initialize unused fields with dummy valuessuper((Void) null);map new ConcurrentHashMap(initialCapacity);this.defaults defaults;// Ensure writes cant be reorderedUNSAFE.storeFence(); }1.2 遗漏子节点的原因 主要还是代码不够严谨解析的时候没有判断子节点是否是数组或对象粗暴的转为String直接赋值了 二、优化措施 基于LinkedHashMap来存储键值对 递归遍历时判断子节点类型不同类型采用不同的处理方式 三、源码 import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.util.CollectionUtils;import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern;/*** author Deng.Weiping* since 2023/11/28 13:57*/ Slf4j public class PropertiesParser {/*** Properties 转 Yaml** param input* return*/public static String castToYaml(String input) {try {MapString, Object properties readProperties(input);return properties2Yaml(properties);} catch (Exception e) {log.error(property 转 Yaml 转换失败, e);}return null;}private static MapString, Object readProperties(String input) {// 使用 LinkedHashMap 保证顺序MapString, Object propertiesMap new LinkedHashMap();for (String line : input.split(StrUtil.LF)) {if (StrUtil.isNotBlank(line)) {// 使用正则表达式解析每一行中的键值对Pattern pattern Pattern.compile(\\s*([^\\s]*)\\s*\\s*(.*)\\s*);Matcher matcher pattern.matcher(line);if (matcher.matches()) {String key matcher.group(1);String value matcher.group(2);propertiesMap.put(key, value);}}}return propertiesMap;}/*** properties 格式转化为 yaml 格式字符串** param properties* return*/private static String properties2Yaml(MapString, Object properties) {if (CollUtil.isEmpty(properties)) {return null;}MapString, Object map parseToMap(properties);StringBuffer stringBuffer map2Yaml(map);return stringBuffer.toString();}/*** 递归解析为 LinkedHashMap** param propMap* return*/private static MapString, Object parseToMap(MapString, Object propMap) {MapString, Object resultMap new LinkedHashMap();try {if (CollectionUtils.isEmpty(propMap)) {return resultMap;}propMap.forEach((key, value) - {if (key.contains(.)) {String currentKey key.substring(0, key.indexOf(.));if (resultMap.get(currentKey) ! null) {return;}MapString, Object childMap getChildMap(propMap, currentKey);MapString, Object map parseToMap(childMap);resultMap.put(currentKey, map);} else {resultMap.put(key, value);}});} catch (Exception e) {e.printStackTrace();}return resultMap;}/*** 获取拥有相同父级节点的子节点** param propMap* param currentKey* return*/private static MapString, Object getChildMap(MapString, Object propMap, String currentKey) {MapString, Object childMap new LinkedHashMap();try {propMap.forEach((key, value) - {if (key.contains(currentKey .)) {key key.substring(key.indexOf(.) 1);childMap.put(key, value);}});} catch (Exception e) {e.printStackTrace();}return childMap;}/*** map集合转化为yaml格式字符串** param map* return*/public static StringBuffer map2Yaml(MapString, Object map) {//默认deep 为零表示不空格deep 每加一层缩进两个空格return map2Yaml(map, 0);}/*** 把Map集合转化为yaml格式 String字符串** param propMap map格式配置文件* param deep 树的层级默认deep 为零表示不空格deep 每加一层缩进两个空格* return*/private static StringBuffer map2Yaml(MapString, Object propMap, int deep) {StringBuffer yamlBuffer new StringBuffer();try {if (CollectionUtils.isEmpty(propMap)) {return yamlBuffer;}String space getSpace(deep);for (Map.EntryString, Object entry : propMap.entrySet()) {Object valObj entry.getValue();if (entry.getKey().contains([) entry.getKey().contains(])) {String key entry.getKey().substring(0, entry.getKey().indexOf([)) :;yamlBuffer.append(space key \n);propMap.forEach((itemKey, itemValue) - {if (itemKey.startsWith(key.substring(0, entry.getKey().indexOf([)))) {yamlBuffer.append(getSpace(deep 1) - );if (itemValue instanceof Map) {StringBuffer valStr map2Yaml((MapString, Object) itemValue, 0);String[] split valStr.toString().split(StrUtil.LF);for (int i 0; i split.length; i) {if (i 0) {yamlBuffer.append(getSpace(deep 2));}yamlBuffer.append(split[i]).append(StrUtil.LF);}} else {yamlBuffer.append(itemValue \n);}}});break;} else {String key space entry.getKey() :;if (valObj instanceof String) { //值为value 类型不用再继续遍历yamlBuffer.append(key valObj \n);} else if (valObj instanceof List) { //yaml List 集合格式yamlBuffer.append(key \n);ListString list (ListString) entry.getValue();String lSpace getSpace(deep 1);for (String str : list) {yamlBuffer.append(lSpace - str \n);}} else if (valObj instanceof Map) { //继续递归遍历MapString, Object valMap (MapString, Object) valObj;yamlBuffer.append(key \n);StringBuffer valStr map2Yaml(valMap, deep 1);yamlBuffer.append(valStr.toString());} else {yamlBuffer.append(key valObj \n);}}}} catch (Exception e) {e.printStackTrace();}return yamlBuffer;}/*** 获取缩进空格** param deep* return*/private static String getSpace(int deep) {StringBuffer buffer new StringBuffer();if (deep 0) {return ;}for (int i 0; i deep; i) {buffer.append( );}return buffer.toString();}}
http://www.yutouwan.com/news/411442/

相关文章:

  • 湖州市建设培训中心网站手机app界面设计图
  • 注册网站时手机号格式不正确3000ok新开传奇网站
  • 建设境外网站需要什么手续自己做网站生意怎么样
  • 网站开发深圳公司大创网
  • js判断是手机还是电脑访问网站静态网站建设报告
  • 棋牌网站搭建平台wordpress 撰写设置
  • 衡水网站建设制作网站seo评测
  • 大型服装商城网站建设成都科技网站建设热
  • 游戏道具网站开发湛江网站建设产品优化
  • 网站关键词的分类成都网络推广培训
  • 网站公司深圳深圳关键词优化平台
  • 高碑店网站建设价格aspnet网站开发例题
  • 做网站没有按照合同履行建设网站需要什么手续
  • 网站域名绑定好处关于建设网站的图片
  • vs2010 网站开发教程织梦网站模板源码php
  • 网站的相对路径商业网站教程
  • 对网站二次开发的认识阳江网红打卡地方
  • 济南网站建设系统介绍服务学校网站建设厂家
  • 用花生做网站公司做的局域网网站怎么登陆
  • 东台网站网站建设广州番禺区有什么好玩的地方
  • 表白视频制作网站电商公司运营策略
  • 手机搭建网站工具做网站work什
  • 当下网站建设php宠物用品公司网站源码
  • 安丘网站建设多少钱长沙市制作企业网站公司
  • 东莞长安网站设计怎么知道网站是什么开源做的
  • 购买网站开发服务费入账代运营被骗怎么追回
  • 太原网站优化服务廊坊开发区规划建设局网站
  • 基金管理公司司网站建设要求做毕业设计免费网站建设
  • 浅谈营销型网站建设的市场费用瑞安公司做网站
  • 建站资源免费镇江网站建设制作方案