总结:利用原生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 "";}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/138805.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringCloud——服务注册——Zookeeper

没有安装Centos7&#xff0c;所以无法安装Zookeeper。 提供者模块代码&#xff1a; https://gitee.com/lixiaogou/cloud2020/tree/master/cloud-provider-payment8004 消费者模块代码&#xff1a; https://gitee.com/lixiaogou/cloud2020/tree/master/cloud-consumerzk-ord…

Surface RT 安装 Linux

零&#xff1a;起因 在家无事找出来一台老旧设备 Surface RT 一代的&#xff0c;系统最新是 Windows 8.1 arm版&#xff0c;应用商店都已经打不开了 虽说有破解方法&#xff0c;能运行些软件&#xff0c;但怎么说也不是任意安装&#xff0c;所以局限性还是相当的大&#xff0…

【Git】的分支和标签的讲解及实际应用场景

目录 一、讲解 1. 环境讲述 2. 应用原因 3. 分支标签的区别 二、分支 1. 命令 2. 场景应用 三、标签 1. 命令 2. 标签规范 3. 应用场景 每篇一获 一、讲解 1. 环境讲述 当软件从开发到正式环境部署的过程中&#xff0c;不同环境的作用如下&#xff1a; 开发环境&a…

【数据结构】树的基本性质(计算树的总结点数与叶结点数)

树的基本性质 ⭐️计算树的总结点与叶结点数&#x1f4ab;性质1&#x1f4ab;性质2&#x1f4ab;例题1&#x1f4ab;例题2 ⭐️计算树的总结点与叶结点数 &#x1f4ab;性质1 性质1 树中的结点数等于所有结点的度数之和加1 例如上面这棵树&#xff0c;A的孩子为B、C、D&…

使用ResponseSelector实现校园招聘FAQ机器人

本文主要介绍使用ResponseSelector实现校园招聘FAQ机器人&#xff0c;回答面试流程和面试结果查询的FAQ问题。FAQ机器人功能分为业务无关的功能和业务相关的功能2类。 一.data/nlu.yml文件   与普通意图相比&#xff0c;ResponseSelector训练数据中的意图采用group/intent格…

工业相机基本知识理解:工业相机IO接口,功耗和供电方式

I-input 相机接收外部信号&#xff0c;可用于触发相机&#xff08;硬触发&#xff09;&#xff0c;也可用于定制不同的 功能&#xff0c;例如使用不同信号宽度来改变相机的曝光时间。主要用于现场设 备控制相机使用&#xff0c;常常配合各种传感器使用 O-output 相机输出信号&a…

src/main/resources/fonts/songti.ttc not found as file or resource.

https://blog.csdn.net/Lewishhhh/article/details/122812272文章浏览阅读4.8k次&#xff0c;点赞2次&#xff0c;收藏7次。背景遇到个需求需要用Java导出PDF文件&#xff0c;权衡之下选择了iText&#xff0c;Java操作pdf的各个开源库之间的对比可以参考https://blog.csdn.net/…

阿里云从公网IP转为弹性公网IP,同时绑定多个IP教程

先将云服务器ECS 转为弹性IP 购买新的弹性辅助网卡 购买弹性公网iP 购买之后选择绑定资源选择第二步购买的网卡 进入ECS 终端 ,输入 ip address可以查看到eth1 的对应mac 地址 终端输入 vi /etc/sysconfig/network-scripts/ifcfg-eth1保存一下信息 DEVICEeth1 #表示新配置…

在 React 中选择使用 JSX 或 JavaScript

在 React 中选择使用 JSX 或 JavaScript JSX vs. JavaScriptReact Component Lifecycle JSX 是 React 最常用的语法之一&#xff0c;它允许我们在 HTML 中嵌入 JavaScript 语句和表达式。但是&#xff0c;如果我们不需要 JSX 又该怎么办呢&#xff1f;让我们一起来了解一下 J…

【Gradle-12】分析so文件和依赖的关系

1、前言 在包大小的占比中&#xff0c;so文件的占比往往是最高的&#xff0c;动辄几兆的大小多一个都会把包大小的指标打爆。 而在各厂商要求对手机CPU ARM架构进行分包适配的情况下&#xff0c;你更需要知道哪些依赖是没有适配v7a/v8a的&#xff0c;这将影响你的APP在应用市场…

数据结构-堆

一、什么是堆 先了解两种特别的二叉树 满二叉树 除最后一层无任何子节点外&#xff0c;每一层上的所有结点都有两个子结点的二叉树 完全二叉树 完全二叉树相对于满二叉树来说&#xff0c;最后一层叶子节点从左到右中间没有空缺的&#xff0c;像这样&#xff1a; 计算机科学…

Pycharm常用快捷键和替换正则表达式

原生快捷键的使用&#xff1a; 1.CtrlF&#xff1a;查找 2.CtrlZ&#xff1a;返回上一步 3.Alt 鼠标左键选择&#xff1a;多行同时编辑&#xff08;上、下、左、右键能够移动光标&#xff09; 按住Ctrl,左键点击&#xff0c;定位光标 编辑过程 URL常用的替换正则表达式&am…

深入浅出理解ResNet网络模型+PyTorch实现

温故而知新&#xff0c;可以为师矣&#xff01; 一、参考资料 论文&#xff1a;Identity Mappings in Deep Residual Networks 论文&#xff1a;Deep Residual Learning for Image Recognition ResNet详解PyTorch实现 PyTorch官方实现ResNet 【pytorch】ResNet18、ResNet20、…

使用Go语言抓取酒店价格数据的技术实现

目录 一、引言 二、准备工作 三、抓取数据 四、数据处理与存储 五、数据分析与可视化 六、结论与展望 一、引言 随着互联网的快速发展&#xff0c;酒店预订已经成为人们出行的重要环节。在选择酒店时&#xff0c;价格是消费者考虑的重要因素之一。因此&#xff0c;抓取酒…

php性能追踪与分析

PHP扩展下载&#xff1a;https://pecl.php.net/package/xhprof php.ini配置 [xhprof] extensionxhprof xhprof.output_dir/temp/xhprof auto_prepend_file /temp/inject_xhprof.php if(php_sapi_name() cli) {return; }$xhprof_config[enabled]1;if(!empty($xhprof_config…

Maven-构建工具

一、背景 开发者编写完成源码&#xff0c;还需要进行编译、测试、打包、部署等一系列操作。在一些小型项目中&#xff0c;还可能通过手动方式进行以上操作。但是在大型项目中&#xff0c;难以确定以上操作的顺序&#xff0c;而且会耗费更高的时间成本。 1.构建工具 构建工具…

k8s删除 Terminating 状态的namespace

删除namespace中的所以pod等 kubectl -n namespace delete pod --all svc pvc 等 1、使用 --force 参数强制删除 这种方法一般情况下是有效的。但在ns长时间处于Terminating的时候也会失效。 kubectl delete ns namespace --force --grace-period0 --grace-period 表…

【Proteus仿真】【Arduino单片机】LCD1602-IIC液晶显示

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用PCF8574、LCD1602液晶等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602液晶显示各种效果。 二、软件设计 /* 作者&#xff1a;嗨小…

20道高频JavaScript面试题快问快答

※其他的快问快答&#xff0c;看这里&#xff01; 10道高频Qiankun微前端面试题快问快答 10道高频webpack面试题快问快答 20道高频CSS面试题快问快答 20道高频JavaScript面试题快问快答 30道高频Vue面试题快问快答 面试中的快问快答 快问快答的情景在面试中非常常见。 在面试过…

day3 ARM

【昨日作业】 .text .global start _start: mov r0,#0 存放sum mov r1,#1 存放相加的数值 loop: cmp r1,#100 bhi wh add r0,r0,r1 add r1,r1,#1 b loop wh: b wh .end 【内存读写指令】 通过内存读写指令可以实现向内存中写入指定数据或者读取指定内存地址的数据 c语言内存…