properties转yml
目前搜索到的大部分代码都存在以下问题:
- 复杂结构解析丢失
- 解析后顺序错乱
所以自己写了一个,经过不充分测试,基本满足使用。可以直接在线使用 在线地址
除了yml和properties互转之外,还可以生成代码、sql转json等,可以去用一下,用爱发电,感谢支持!
源码:
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.CollectionUtils;
import org.yaml.snakeyaml.Yaml;import java.io.IOException;
import java.util.ArrayList;
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 PropertiesUtil {/*** yaml 转 Properties** @param input* @return*/public static String castToProperties(String input) {Map<String, Object> propertiesMap = new LinkedHashMap<>();Map<String, Object> yamlMap = new Yaml().load(input);flattenMap("", yamlMap, propertiesMap);StringBuffer strBuff = new StringBuffer();propertiesMap.forEach((key, value) -> strBuff.append(key).append("=").append(value).append(StrUtil.LF));return strBuff.toString();}/*** Properties 转 Yaml** @param input* @return*/public static String castToYaml(String input) {try {Map<String, Object> properties = readProperties(input);return properties2Yaml(properties);} catch (Exception e) {log.error("property 转 Yaml 转换失败", e);}return null;}private static Map<String, Object> readProperties(String input) throws IOException {Map<String, Object> propertiesMap = new LinkedHashMap<>(); // 使用 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;}/*** 递归 Map 集合,转为 Properties集合** @param prefix* @param yamlMap* @param treeMap*/private static void flattenMap(String prefix, Map<String, Object> yamlMap, Map<String, Object> treeMap) {yamlMap.forEach((key, value) -> {String fullKey = prefix + key;if (value instanceof LinkedHashMap) {flattenMap(fullKey + ".", (LinkedHashMap) value, treeMap);} else if (value instanceof ArrayList) {List values = (ArrayList) value;for (int i = 0; i < values.size(); i++) {String itemKey = String.format("%s[%d]", fullKey, i);Object itemValue = values.get(i);if (itemValue instanceof String) {treeMap.put(itemKey, itemValue);} else {flattenMap(itemKey + ".", (LinkedHashMap) itemValue, treeMap);}}} else {treeMap.put(fullKey, value.toString());}});}/*** properties 格式转化为 yaml 格式字符串** @param properties* @return*/private static String properties2Yaml(Map<String, Object> properties) {if (CollUtil.isEmpty(properties)) {return null;}Map<String, Object> map = parseToMap(properties);StringBuffer stringBuffer = map2Yaml(map);return stringBuffer.toString();}/*** 递归解析为 LinkedHashMap** @param propMap* @return*/private static Map<String, Object> parseToMap(Map<String, Object> propMap) {Map<String, 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;}Map<String, Object> childMap = getChildMap(propMap, currentKey);Map<String, 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 Map<String, Object> getChildMap(Map<String, Object> propMap, String currentKey) {Map<String, 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(Map<String, Object> map) {//默认deep 为零,表示不空格,deep 每加一层,缩进两个空格return map2Yaml(map, 0);}/*** 把Map集合转化为yaml格式 String字符串** @param propMap map格式配置文件* @param deep 树的层级,默认deep 为零,表示不空格,deep 每加一层,缩进两个空格* @return*/private static StringBuffer map2Yaml(Map<String, Object> propMap, int deep) {StringBuffer yamlBuffer = new StringBuffer();try {if (CollectionUtils.isEmpty(propMap)) {return yamlBuffer;}String space = getSpace(deep);for (Map.Entry<String, 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((Map<String, 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");List<String> list = (List<String>) entry.getValue();String lSpace = getSpace(deep + 1);for (String str : list) {yamlBuffer.append(lSpace + "- " + str + "\n");}} else if (valObj instanceof Map) { //继续递归遍历Map<String, Object> valMap = (Map<String, 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();}}
相关文章:

properties转yml
目前搜索到的大部分代码都存在以下问题: 复杂结构解析丢失解析后顺序错乱 所以自己写了一个,经过不充分测试,基本满足使用。可以直接在线使用 在线地址 除了yml和properties互转之外,还可以生成代码、sql转json等,可…...

谈谈中间件设计的思路
前言 想要设计和真正理解中间件的架构理论和思想。对于开发来说需要具备三个关键的能力 1:基础通用技术的深入理解和运用2:了解和熟悉常见中间件的设计思想,且有自己的感悟,并且能按照自己的理解模仿写一写3:业务的高度理解能力…...
WT2605-24SS音频蓝牙录放语音芯片:标准蓝牙功能与多样化存储播放方式助力音频体验升级
在音频技术日新月异的今天,WT2605-24SS音频蓝牙录放语音芯片以其强大的功能和出色的性能,成为了音频市场的一颗璀璨明星。该芯片不仅具备标准音频蓝牙功能,还支持蓝牙电话本、录音功能以及多种存储和播放方式,为用户提供了更加便捷…...
openssl生成ssl证书
x509证书一般会用到三类文,key,csr,crt。 Key 是私用密钥openssl格,通常是rsa算法。 Csr 是证书请求文件,用于申请证书。在制作csr文件的时,必须使用自己的私钥来签署申,还可以设定一个密钥。…...

以太网PHY,MAC接口
本文主要介绍以太网的 MAC 和 PHY,以及之间的 MII(Media Independent Interface ,媒体独立接口)和 MII 的各种衍生版本——GMII、SGMII、RMII、RGMII等。 简介 从硬件的角度看,以太网接口电路主要由MAC(M…...
c语言中 , x++ 和 ++x的区别
一 c语言中 , x 和 x的区别 x 和 x 是 C 语言中的自增运算符,它们的区别在于它们的执行时机和返回值: 1. x (后缀自增): 先使用变量的值,然后再将变量的值加 1。这意味着,如果你在一个表达式中使用了 x,那么该表达式…...

DBeaver 社区版(免费版)下载、安装、解决驱动更新出错问题
DBeaver 社区版(免费版) DBeaver有简洁版,企业版,旗舰版,社区版(免费版)。除了社区版,其他几个版本都是需要付费的,当然相对来说,功能也要更完善些ÿ…...

景联文科技加入中国人工智能产业联盟(AIIA)数据委员会
近日,景联文科技加入中国人工智能产业联盟(AIIA)数据委员会,成为委员会成员单位。 中国人工智能产业发展联盟(简称AIIA)是在国家发改委、科技部、工信部、网信办指导下,由中国信息通信研究院等单…...
数据结构 / 结构体指针
1. 格式 struct 结构体名{数据类型 成员1;数据类型 成员2; .... };struct 结构体名 *指针变量名 2. 结构体指针指向普通变量的地址 struct CAR{char name[10];int price; };struct CAR car{"byd",160}; struct CAR *p&car; //p是指向结构体变量car的指针// p…...

P1 什么是链表 C语言简单易懂
目录 前言 01 什么是链表 02 数组的特点 03 数组的缺点 3.1 删除数组其中一个元素 3.2 数组增加某个节点 04 链表 前言 🎬 个人主页:ChenPi 🐻推荐专栏1: 《 C 》✨✨✨ 🔥 推荐专栏2: 《 Linux C应用编程(概念…...

Python实现FA萤火虫优化算法优化循环神经网络分类模型(LSTM分类算法)项目实战
说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 萤火虫算法(Fire-fly algorithm,FA)由剑桥大学Yang于2009年提出 , …...
Spring Task
Spring Task 是Spring框架提供的任务调度工具,可以按照约定的时间自动执行某个代码逻辑。 **定位:**定时任务框架 **作用:**定时自动执行某段Java代码 cron表达式 cron表达式其实就是一个字符串,通过cron表达式可以定义任务触…...

HttpServletRequest/Response视频笔记
学习地址:144-尚硅谷-Servlet-HttpServletRequest类的介绍_哔哩哔哩_bilibili 目录 1.HttpServletRequest 类 a.HttpServletRequest类有什么作用 b.HttpServletRequest类的常用方法 c.如何获取请求参数 d.解决post请求中文乱码问题 获取请求的参数值相关问题 …...

网上选课系统源码(Java)
JavaWebjsp网上选课系统源码 运行示意图:...

mac修改默认shell为bash
1. 打开系统偏好设置 2. 点击用户群组 3. 按住ctrl,点击用户名 4. 点击高级选项,修改登录shell 参考:在 Mac 上将 zsh 用作默认 Shell - 官方 Apple 支持 (中国)...
基于Java SSM小区物业管理系统
小区有多栋住宅,每栋楼有多套物业(房屋),物业管理公司提供物业管理服务,业主需要按月缴纳物业费。小区物业管理系统对物业公司的日常工作进行管理。系统管理的对象及操作有: 楼宇信息:楼号、户数、物业费标准。 房屋信…...

计算机网络408
一:计算机网络体系结构 1.计网的概念,组成,功能和分类 一:计算机网络的发展 (3)从功能组成视觉看:分为资源子网和通信子网 2.计网性能指标 注意:带宽影响链路入口处的发射速率—>从而影响了…...

【android开发-01】android中toast的用法介绍
1,android中toast的作用 在Android开发中,Toast是一种用于向用户显示简短消息的轻量级对话框。它通常用于向用户提供一些即时的反馈信息,例如操作结果、提示或警告。 Toast的主要作用如下: 提供反馈:Toast可以在用户…...

打印元素绘制协议Java实现
我一直提倡的面向接口和约定编程,而打印元素绘制协议一直是我推荐的打印实现方式,我以前只是强调按打印元素绘制协议输出数据就行了,有实现程序按协议控制打印,说是可以用任何语言实现客户端程序而不影响打印业务,那么…...
js 处理编译器html 包含img的标签并设置width
var imgElements document.getElementsByTagName(img); for (let imgElement of imgElements) { //1.如果有style属性,去掉style属性中的width属性和height属性 if (imgElement.hasAttribute(st…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...

遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...

Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...