工具

news/2024/7/5 3:29:54/文章来源:https://www.cnblogs.com/Zzzyyw/p/18280154

工具

Zip操作

import lombok.extern.slf4j.Slf4j;import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;@Slf4j
public class FileZipUtils {private static final String POINT = ".";private static final String SUFFIX = POINT + "zip";/*** 创建压缩文件** @param filePath 文件路径*/public static void zip(String filePath) {zip(new File(filePath));}/*** 创建压缩文件** @param file 文件*/public static void zip(File file) {String filePath = file.getAbsolutePath();String zipFilePath;if (file.isDirectory()) {zipFilePath = filePath + SUFFIX;} else {zipFilePath = filePath.substring(0, filePath.lastIndexOf(POINT)) + SUFFIX;}log.debug("zipFilePath:{}", zipFilePath);zip(file, zipFilePath);}/*** 创建压缩文件** @param filePath    文件路径* @param zipFilePath 压缩文件路径*/public static void zip(String filePath, String zipFilePath) {File file = new File(filePath);zip(file, zipFilePath);}/*** 创建压缩文件** @param file        文件* @param zipFilePath 压缩文件路径*/public static void zip(File file, String zipFilePath) {try (ZipOutputStream zipOutputStream = new ZipOutputStream(Files.newOutputStream(Paths.get(zipFilePath)))) {// 添加文件到压缩包if (file.isDirectory()) {compressFolder(file, zipOutputStream);} else {addToZipFile(file, zipOutputStream);}} catch (IOException e) {log.error("创建压缩文件 error", e);}}/*** 解压缩文件** @param zipFilePath zip文件路径*/public static void unzip(String zipFilePath) {File zipFile = new File(zipFilePath);unzip(zipFilePath, zipFile.getParentFile().getAbsolutePath());}/*** 解压缩文件** @param zipFile zip文件*/public static void unzip(File zipFile) {String zipFilePath = zipFile.getAbsolutePath();unzip(zipFilePath, zipFile.getParentFile().getAbsolutePath());}/*** 解压缩文件** @param zipFilePath zip文件路径* @param filePath    文件路径*/public static void unzip(String zipFilePath, String filePath) {try (ZipInputStream zipInputStream = new ZipInputStream(Files.newInputStream(Paths.get(zipFilePath)))) {// 解压缩文件unzipFiles(zipInputStream, filePath);} catch (IOException e) {log.error("解压缩文件 error", e);}}private static void unzipFiles(ZipInputStream zipInputStream, String filePath) throws IOException {byte[] buffer = new byte[1024];ZipEntry entry;while ((entry = zipInputStream.getNextEntry()) != null) {String fileName = entry.getName();File outputFile = new File(getPath(filePath, fileName));// 创建文件夹// entry.isDirectory() 的 判断逻辑为 name.endsWith("/"),受到系统限制,故不使用if (fileName.endsWith(File.separator)) {outputFile.mkdirs();} else {// 创建文件并写入内容new File(outputFile.getParent()).mkdirs();try (FileOutputStream fileOutputStream = new FileOutputStream(outputFile)) {int bytesRead;while ((bytesRead = zipInputStream.read(buffer)) != -1) {fileOutputStream.write(buffer, 0, bytesRead);}}}zipInputStream.closeEntry();}}/*** 添加文件夹到zip文件** @param folder          文件夹* @param zipOutputStream zip文件* @throws IOException IOException*/private static void compressFolder(File folder, ZipOutputStream zipOutputStream) throws IOException {compressFolder(folder, folder.getName(), zipOutputStream);}/*** 添加文件夹到zip文件** @param folder          文件夹* @param zipEntryName    zip压缩文件名称* @param zipOutputStream zip文件* @throws IOException IOException*/private static void compressFolder(File folder, String zipEntryName, ZipOutputStream zipOutputStream) throws IOException {File[] folderFiles = folder.listFiles();if (folderFiles != null && folderFiles.length > 0) {for (File folderFile : folderFiles) {String name = folderFile.getName();String folderFileEntryName = getPath(zipEntryName, name);if (folderFile.isDirectory()) {// 压缩子文件夹compressFolder(folderFile, folderFileEntryName, zipOutputStream);} else {// 压缩文件addToZipFile(folderFile, folderFileEntryName, zipOutputStream);}}} else {// 空文件夹处理emptyFolder(zipEntryName, zipOutputStream);}}/*** 空文件夹处理** @param zipEntryName    zip压缩文件名称* @param zipOutputStream zip文件* @throws IOException IOException*/private static void emptyFolder(String zipEntryName, ZipOutputStream zipOutputStream) throws IOException {// // 空文件夹的处理ZipEntry entry = new ZipEntry(getSepPath(zipEntryName));zipOutputStream.putNextEntry(entry);// 没有文件,不需要文件的copyzipOutputStream.closeEntry();}/*** 添加文件到zip文件** @param file            文件* @param zipOutputStream zip文件* @throws IOException IOException*/private static void addToZipFile(File file, ZipOutputStream zipOutputStream) throws IOException {addToZipFile(file, file.getName(), zipOutputStream);}/*** 添加文件到zip文件** @param file            文件* @param zipEntryName    zip压缩文件名称* @param zipOutputStream zip文件* @throws IOException IOException*/private static void addToZipFile(File file, String zipEntryName, ZipOutputStream zipOutputStream) throws IOException {// 创建ZipEntry对象并设置文件名ZipEntry entry = new ZipEntry(zipEntryName);zipOutputStream.putNextEntry(entry);// 读取文件内容并写入Zip文件try (FileInputStream fileInputStream = new FileInputStream(file)) {byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = fileInputStream.read(buffer)) != -1) {zipOutputStream.write(buffer, 0, bytesRead);}}// 完成当前文件的压缩zipOutputStream.closeEntry();}/*** 获取 separator结尾 路径** @param path 获取 separator结尾 路径* @return separator结尾 路径*/private static String getSepPath(String... path) {return getPath(path) + File.separator;}/*** 获取路径** @param path 获取路径* @return 路径*/private static String getPath(String... path) {return String.join(File.separator, path);}/*** 创建文件** @param file 文件*/private static void createNewFile(File file) {String path = file.getAbsolutePath();if (!file.exists()) {try {boolean create = file.createNewFile();log.info("createNewFile:{} -> path:{}", create, path);} catch (IOException e) {log.error("createNewFile -> path:{}, error", path);}}}
}

Mybatis

Mybatis日志替换?并打印耗时

import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.ParameterMapping;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import org.apache.ibatis.type.TypeHandlerRegistry;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Component;import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Objects;
import java.util.regex.Matcher;/*** MyBatis拦截器打印不带问号的完整sql语句*/
@Slf4j
@Component
// 只在开发环境下执行
// @ConditionalOnProperty(value = "spring.profiles.active", havingValue = "dev")
@ConditionalOnProperty(value = "com.mybatis.showSql", havingValue = "1")
@Intercepts({// update 包括了最常用的 insert/update/delete 三种操作@Signature(type = Executor.class, method = "update", args = {MappedStatement.class,Object.class}),@Signature(type = Executor.class, method = "query", args = {MappedStatement.class,Object.class, RowBounds.class, ResultHandler.class})})
public class MybatisSQLResolverInterceptor implements Interceptor {@Overridepublic Object intercept(Invocation invocation) throws Throwable {// 获取xml中的一个select/update/insert/delete节点,是一条SQL语句MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];Object parameter = null;// 获取参数,if语句成立,表示sql语句有参数,参数格式是map形式if (invocation.getArgs().length > 1) {parameter = invocation.getArgs()[1];}// 获取到节点的id,即sql语句的idString id = mappedStatement.getId();// BoundSql就是封装myBatis最终产生的sql类BoundSql boundSql = mappedStatement.getBoundSql(parameter);// 获取节点的配置Configuration configuration = mappedStatement.getConfiguration();// 获取到最终的sql语句try {String sql = showSql(configuration, boundSql);log.info("{} ==> : Preparing: {}", id, sql);} catch (Exception e) {log.error("{} ==> : Preparing error: {}", id, e.getMessage());}long start = System.currentTimeMillis();// 执行完上面的任务后,不改变原有的sql执行过程Object result = invocation.proceed();long time = System.currentTimeMillis() - start;// 获取到最终的结果数try {String total = shownTotal(result);log.info("{} <== : Total: {} , time: {}ms", id, total, time);} catch (Exception e) {log.error("{} <== : Total error: {}", id, e.getMessage());}return result;}/*** 进行?的替换*/public static String showSql(Configuration configuration, BoundSql boundSql) {// 获取参数Object parameterObject = boundSql.getParameterObject();List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();// sql语句中多个空格都用一个空格代替String sql = boundSql.getSql().replaceAll("[\\s]+", " ");if (CollectionUtils.isNotEmpty(parameterMappings) && parameterObject != null) {// 获取类型处理器注册器,类型处理器的功能是进行java类型和数据库类型的转换TypeHandlerRegistry typeHandlerRegistry = configuration.getTypeHandlerRegistry();// 如果根据parameterObject.getClass()可以找到对应的类型,则替换if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) {sql = sql.replaceFirst("\\?",Matcher.quoteReplacement(getParameterValue(parameterObject)));} else {// MetaObject主要是封装了originalObject对象,提供了get和set的方法用于获取和设置originalObject的属性值,主要支持对JavaBean、Collection、Map三种类型对象的操作MetaObject metaObject = configuration.newMetaObject(parameterObject);for (ParameterMapping parameterMapping : parameterMappings) {String propertyName = parameterMapping.getProperty();if (metaObject.hasGetter(propertyName)) {Object obj = metaObject.getValue(propertyName);sql = sql.replaceFirst("\\?",Matcher.quoteReplacement(getParameterValue(obj)));} else if (boundSql.hasAdditionalParameter(propertyName)) {// 该分支是动态sqlObject obj = boundSql.getAdditionalParameter(propertyName);sql = sql.replaceFirst("\\?",Matcher.quoteReplacement(getParameterValue(obj)));} else {// 未知参数,替换?防止错位sql = sql.replaceFirst("\\?", "unknown");}}}}return sql;}/*** 获取结果数*/private String shownTotal(Object result) {if (Objects.nonNull(result)) {if (result instanceof Collection<?>) {int size = ((Collection<?>) result).size();return String.valueOf(size);}if (result instanceof Number) {return String.valueOf(result);}if (result instanceof Page<?>) {int size = ((Page<?>) result).getRecords().size();return String.valueOf(size);}}return "0";}/*** 如果参数是String,则添加单引号* 如果参数是日期,则转换为时间格式器并加单引号; 对参数是null和不是null的情况作了处理*/private static String getParameterValue(Object obj) {String value;if (obj instanceof String) {value = "'" + obj.toString() + "'";} else if (obj instanceof Date) {DateFormat formatter = DateFormat.getDateTimeInstance(DateFormat.DEFAULT,DateFormat.DEFAULT, Locale.CHINA);value = "'" + formatter.format(new Date()) + "'";} else {if (obj != null) {value = obj.toString();} else {value = "";}}return value;}
}

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

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

相关文章

阿里228x82y还原之递归数组解密

声明 本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 目标网站 某里228 分析逆向流程 228递归函数str解密 原理就是用数组push最后填充下,然…

ffmpeg在Windows上的安装

首先进入官网Download FFmpeg 选择windows版本下载想要的版本 Gyan.dev的版本可能会更符合Windows标准,而BtbN的版本可能会更加开放和跨平台往下拉选择想要的版本进行下载 我下载的是第一个下载好之后解压文件复制bin目录的路径 接着按照下面的顺序进行环境配置,结束后一路确…

leaflet如何把低层级瓦片在高层级显示

https://leafletjs.cn/reference.html#gridlayer使用了maxNativeZoom属性 示例 let map = L.map("map", {attributionControl: false,maxZoom: 18, }).setView([62, -82], 6);let layer_keepLevel_16 = L.tileLayer("url", {minZoom: 1,maxZoom: 18,maxNat…

Java JVM——11. 执行引擎

1.概述执行引擎属于JVM的下层,里面包括:解释器、即时编译器、垃圾回收器。执行引擎是Java虚拟机核心的组成部分之一。“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而…

vue3+vite打包优化

1、清除console和debugger 安装 terser插件npm install terser -Dbuild里添加terserOptions配置// 打包环境移除console.log,debugger terserOptions: { compress: { drop_console: true, drop_debugger: true } }, 二、gzip静态资源压缩 第一步:客户端打包开启首先下载 vit…

Java JVM 执行引擎深入解析

1.执行引擎概述执行引擎属于JVM的下层,里面包括:解释器、即时编译器、垃圾回收器。执行引擎是Java虚拟机核心的组成部分之一。“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面…

Vuex

Vuex 什么是Vuex? 概念:专门在Vue中实现集中式状态(数据)管理的一个Vue插件,对应用中多个组件的共享状态进行集中式管理(读/写),也是组件间通信的方式,且适用于任意组件间通信 之前想要传递数据,可以使用全局事件总线/消息订阅去实现,但是如果有很多组件都想要去读和写…

27-String类

String字符串是常量,创建之后不可改变 字符串字面值存储在字符串池中,可以共享 String s = "hello"; 产生一个对象,字符串池中存储 String s = new String("hello");//产生两个对象,堆、池各存储一个String name = "hello";//"hello…

01字典树和可持久化01字典树

01字典树 01字典树是一种只有0和1两种边的字典树。可以解决查询第 \(k\) 小,查询 \(x\) 是第几小等问题。 查询第 \(k\) 小 可以把输入的数转成等长二进制,然后插入01字典树。比如将 \([0,0,1,3,3]\) 插入字典树:这里红色数字表示以该段为前缀的数的个数,黑色表示对应的数。…

c# , net 创建树形结构,创建树形节点

/// <summary> /// 生成树形结构 /// </summary> public void GetTreeNode() {//SqlHelper.GetSqlDataReader是封装的查询数据库语句,可根据自己需求封装//假设获取所有一级节点List<Products> products = SqlHelper.GetSqlDataReader(sql);for (int i = 0; …

abc360 E 题解

E 对于位置2~n,它们的概率是相等的。 n*n个(x,y)对。其中x可以等于y。对于x/y,y的逆元rev(y)为mul(y,mod-2)。 加、减、乘、除都可以做。比如48/9和16/3的结果是一样的,48*rev(9)%mod = 16*rev(3)%mod。比如3*rev(2)%mod = (rev(2)+rev(2)+rev(2))%mod.对于每次操作,有多少…

数业智能荣登「全球应用算法模型大赛50强」

近日,由上海市经济和信息化委员会、上海市普陀区人民政府,上海市人工智能行业协会主办,上海人工智能研究院等单位联合承办的《BPAA第四届全球应用算法模型典范大赛》经过一个多月的角逐,最终公布《BPAA第四届全球应用算法模型典范大赛TOP50榜单》。数业智能心大陆凭借独立自…

快速调用 GLM-4-9B-Chat 语言模型

一、确认本机显卡配置二、下载大模型 国内可以从魔搭社区下载, 下载地址:https://modelscope.cn/models/ZhipuAI/glm-4-9b-chat/files 三、运行官方代码import torch from transformers import AutoModelForCausalLM, AutoTokenizerdevice = "cuda"tokenizer = A…

戴尔服务器SQL server数据恢复

服务器数据恢复环境: 一台Dell服务器,共有10块硬盘,配置了raid5磁盘阵列,操作系统:linux,里面存有SQL server数据库。服务器数据恢复故障检测分析: 服务器在正常运行过程中,对服务器进行重装系统操作,操作成功后发现服务器的磁盘分区与原来不同,其中一个分区丢失,其…

网络安全:Nginx安全问题使1400多万台服务器容易受到ddos攻击

据外媒报道,近日 nginx 被爆出存在安全问题,有可能会致使 1400 多万台服务器易遭受 DoS 攻击。 而导致安全问题的漏洞存在于 HTTP/2 和 MP4 模块中。 新版本的Nginx Web服务器已于11月6日发布,用于修复影响1.15.6,1.14.1之前版本的多个安全问题, 该漏洞允许潜在的攻击者触发…

服务器硬盘亮红灯数据恢复

故障服务器数据恢复环境: 一台故障服务器,有3块SAS 320GB的硬盘组建的raid5磁盘阵列。 故障服务器数据恢复检测分析: 服务器运行过程中有一块硬盘的指示灯变为红色,raid5磁盘阵列出现故障,服务器上层操作系统的分区无法识别。服务器数据恢复过程: 1、将故障服务器上磁盘编…

服务器RAID5故障该如何解决

故障服务器恢复环境: 一台HP LH6000的服务器,4块18GB的硬盘做成RAID5磁盘阵列,操作系统为Window 2000,数据库是Server 2000。 故障服务器检测分析: 故障服务器经检测发现,一块硬盘红灯闪亮,机器还在正常运行,但没有多久,系统就不能正常运行,这时才发现另一块硬盘的红…

存储断电导致虚拟机无法启动

故障存储虚拟机环境: 一台VMware虚拟机无法启动(虚拟机中存储了oracle数据库)。故障存储虚拟机检测分析: 发生故障的存是由于机房意外断电导致,清空cache并尝试重新启动该虚拟机但失败。需要对该存储进行数据恢复。 故障虚拟机数据恢复流程: 1.合并虚拟机快照(因虚拟机中…

振弦采集仪在岩土工程监测中的优点与应用

振弦采集仪在岩土工程监测中的优点与应用 河北稳控科技振弦采集仪是一种常用的岩土工程监测仪器,通过测量振弦的振动频率和振幅,可以得到土体的力学特性参数,从而对土体的变形和稳定性进行分析和评估。振弦采集仪具有一些优点,同时在岩土工程的监测中有着广泛的应用。 第一…