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

总结:利用原生JDK封装工具类,解析properties配置文件以及MF清单文件

总结:利用原生JDK封装工具类,解析properties配置文件以及MF清单文件

  • 一·背景描述:
    • 1.在不同的项目中,项目使用的开发框架都不一样,甚至是JDK原生开发模式。此时解析配置文件以及jar包中的清单文件,就只能利用JDK原生办法解析,而无法利用流行热门框架解析
    • 2.了解JDK原生解析配置文件以及清单文件的实现方式,有助于自己理解各种开源框架的底层实现方式。因为大多数开源框架本质就是在JDK、JavaEE的基础上,利用各种设计模式进行封装而来,从而提升程序员的开发效率。
  • 二·properties配置文件解析工具类:该工具类也可以用于解析MANIFEST.MF清单文件
  • 三·MANIFEST.MF清单文件解析工具类:

一·背景描述:

1.在不同的项目中,项目使用的开发框架都不一样,甚至是JDK原生开发模式。此时解析配置文件以及jar包中的清单文件,就只能利用JDK原生办法解析,而无法利用流行热门框架解析

2.了解JDK原生解析配置文件以及清单文件的实现方式,有助于自己理解各种开源框架的底层实现方式。因为大多数开源框架本质就是在JDK、JavaEE的基础上,利用各种设计模式进行封装而来,从而提升程序员的开发效率。

二·properties配置文件解析工具类:该工具类也可以用于解析MANIFEST.MF清单文件

package utils;import java.io.File;
import java.io.FileInputStream;
import java.util.Properties;/*** @Description Properties解析工具类,manifest.mf文件工具类* 注意:一个key后面的值不能换行,否则会读取不完整* <p>* Copyright @ 2022 Shanghai Mise Co. Ltd.* All right reserved.* <p>* @Author LiuMingFu* @Date 2023-05-17 16:25*/
public class PropUtil {public static void main(String[] args) {String fileUrl = "/Users/ideal/Desktop/web/test/shgc_WeChat2OA_config.properties";String keySecret = getPropValue(fileUrl, "key_secret");System.out.println(keySecret);File file = new File(fileUrl);String port = getPropValue(file, "port");System.out.println(port);}/*** 解析配置文件/manifest.mf文件,获取指定key的value值** @param filePath Properties配置文件路径/manifest.mf文件路径* @param key      需要获取值的key* @return* @author LiuMingFu* @date 2023-05-17*/public static String getPropValue(String filePath, String key) {String value = "";try {FileInputStream fileInput = new FileInputStream(filePath);Properties prop = new Properties();prop.load(fileInput);value = prop.getProperty(key);} catch (Exception ex) {ex.printStackTrace();}return value;}/*** 解析配置文件/manifest.mf文件,获取指定key的value值** @param file Properties配置文件对象/manifest.mf文件对象* @param key  需要获取值的key* @return* @author LiuMingFu* @date 2023-05-17*/public static String getPropValue(File file, String key) {String value = "";try {FileInputStream fileInput = new FileInputStream(file);Properties prop = new Properties();prop.load(fileInput);value = prop.getProperty(key);} catch (Exception ex) {ex.printStackTrace();}return value;}}

三·MANIFEST.MF清单文件解析工具类:

package utils;import java.io.IOException;
import java.util.Map;
import java.util.jar.Attributes;
import java.util.jar.JarFile;
import java.util.jar.Manifest;import static java.util.jar.Attributes.Name.MAIN_CLASS;/*** @Description TODO* <p>* Copyright @ 2022 Shanghai Mise Co. Ltd.* All right reserved.* <p>* @Author LiuMingFu* @Date 2023/11/9 10:52*/
public class JarUtil {public static void main(String[] args) throws IOException {String filePath = "/Users/ideal/Desktop/lib/Hello2.jar";Attributes attributes = parseManifestFile(filePath);for (Object o : attributes.keySet()) {System.out.println("key=" + o + "  value=" + attributes.getValue(o.toString()));}System.out.println(getMainClass(filePath));System.out.println(getMFValue(filePath, "Created-By"));}/*** 解析jar包中的MANIFEST.MF(manifest.mf)文件,返回一个类似map的集合对象** @param jarFilePath jar包路径* @return* @author LiuMingFu* @date 2023/11/9*/public static Attributes parseManifestFile(String jarFilePath) throws IOException {if (jarFilePath != null && !"".equals(jarFilePath)) {JarFile jarFile = new JarFile(jarFilePath);Manifest manifest = jarFile.getManifest();Attributes mainAttributes = manifest.getMainAttributes();return mainAttributes;} else {return null;}}/*** 解析jar包中的MANIFEST.MF(manifest.mf)文件,返回一个Main-Class的属性值** @param jarFilePath jar包路径* @return* @author LiuMingFu* @date 2023/11/9*/public static String getMainClass(String jarFilePath) throws IOException {JarFile jarFile = new JarFile(jarFilePath);Manifest mf = jarFile.getManifest();Attributes mainAttributes = mf.getMainAttributes();for (Map.Entry<Object, Object> entry : mainAttributes.entrySet()) {String key = entry.getKey().toString();if (key.equalsIgnoreCase(MAIN_CLASS.toString())) {return entry.getValue().toString();}}return "";}/*** 解析jar包中的MANIFEST.MF(manifest.mf)文件,返回一个指定key的属性值** @param jarFilePath jar包路径* @param key         manifest.mf文件的一个key* @return* @author LiuMingFu* @date 2023/11/9*/public static String getMFValue(String jarFilePath, String key) throws IOException {JarFile jarFile = new JarFile(jarFilePath);Manifest mf = jarFile.getManifest();Attributes mainAttributes = mf.getMainAttributes();for (Map.Entry<Object, Object> entry : mainAttributes.entrySet()) {String keyTemp = entry.getKey().toString();if (keyTemp.equalsIgnoreCase(key)) {return entry.getValue().toString();}}return "";}
}

相关文章:

  • 七个优秀微服务跟踪工具
  • 微服务-开篇-个人对微服务的理解
  • 【Springboot】基于注解式开发Springboot-Vue3整合Mybatis-plus实现分页查询
  • 每次重启完IDEA,application.properties文件里的中文变成?
  • Flink 基础 -- 应用开发(Table API SQL) 概念和通用API
  • Linux驱动开发——USB设备驱动
  • 从windows iso文件中提取install.wim
  • 从零开始搭建微服务(二)
  • 【星海出品】flask(三) 组件
  • 单词规律问题
  • 链表经典面试题之二
  • 内向基环树
  • 基于DS1302时钟液晶12864显示2路闹钟仿真及源程序
  • 【操作系统】考研真题攻克与重点知识点剖析 - 第 2 篇:进程与线程
  • 迅为龙芯3A5000主板,支持PCIE 3.0、USB 3.0和 SATA 3.0显示接口2 路、HDMI 和1路 VGA,可直连显示器
  • 深入了解以太坊
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • angular学习第一篇-----环境搭建
  • C++类的相互关联
  • CSS3 变换
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • Git的一些常用操作
  • gulp 教程
  • HTTP中的ETag在移动客户端的应用
  • java8-模拟hadoop
  • JS基础之数据类型、对象、原型、原型链、继承
  • Tornado学习笔记(1)
  • Vue 2.3、2.4 知识点小结
  • vue-router 实现分析
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 如何设计一个比特币钱包服务
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • 责任链模式的两种实现
  • No resource identifier found for attribute,RxJava之zip操作符
  • Prometheus VS InfluxDB
  • 进程与线程(三)——进程/线程间通信
  • 说说我为什么看好Spring Cloud Alibaba
  • !!java web学习笔记(一到五)
  • #1014 : Trie树
  • (3)llvm ir转换过程
  • (4)事件处理——(7)简单事件(Simple events)
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (二)c52学习之旅-简单了解单片机
  • (五)IO流之ByteArrayInput/OutputStream
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (一)80c52学习之旅-起始篇
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .NET Core WebAPI中封装Swagger配置
  • .net refrector
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?