1、调用:
使用
CompressionUtil.zip2(Map<String, InputStream> in, OutputStream out) 方法
压缩为一个export-wsdl-20141023135549.zip的压缩包并自动下载
包括:
1、各服务名称文件夹 及子文件夹下3个文件
2、校验码文件md5checksum.txt
md5checksum.txt文件内容:
注意:
1、Map<String, InputStream> in :
key为各文件名
value为各文件内容InputStream流
2、FilenameUtils.getName(path)
数据库中文件路径SERVER_ABS_PATH为:
/home/esbapp/lightesb/SYSFILE/1403612785951/SB_FI_ORS_InquiryPaymentApplicationInfoSrv/MsgHeader.xsd
获取的结果为MsgHeader.xsd
FilenameUtils.getName(path) a/b/c.txt --> c.txt a.txt --> a.txt a/b/c --> c a/b/c/ --> ""
数据库表格式:
ESB_WSDL_FILE:
ESB_FILE(一个表,数据太长分开了):
视图ESB_WSDL_FILE_V省略
代码:
@RequestMapping(value = "esbService/exportWsdl.do", method = RequestMethod.GET) @ResponseBody public void exportWsdl(@RequestParam String info, HttpServletResponse response){ //logger.debug("exportWsdl begin..."); //logger.debug("parm : " + info); // 判断参数非空 if(StringUtils.isNotEmpty(info)){ /** * 构建Map<Long, String> basePath * <srvId,srvName> 用于下面由srvId获取srvName,构建srvName文件夹 * info = srvId1:srvName1,srvId2:srvName2,... * 无需关注 */ // zip包基础路径 Map<Long, String> basePath = new HashMap<Long, String>(); // 要下载WSDL的服务id List<Long> srvId = new ArrayList<Long>(); String[] srvInfo = info.split(","); for(String si : srvInfo){ String[] s = si.split(":"); Long id = null; String srvName = null; try { id = Long.parseLong(s[0]); srvName = s[1]; } catch (Exception e) { logger.error("exportWsdl parse parm error... " + si); continue; } srvId.add(id); basePath.put(id, srvName); } logger.debug("parse parm pass..."); /** * ======================================= * 压缩并自动下载 * 重点关注部分 * ======================================= */ // 获取wsdl文件清单 List<EsbWsdlFileV> ewf = esbServiceVDS.getWsdlFileList(srvId); //logger.debug("file list num : " + ewf.size()); // detail为md5checksum.txt文件内容 StringBuffer detail = new StringBuffer(); detail.append("md5 checksum").append("\n"); detail.append("\n"); Long timestamp = System.currentTimeMillis(); Map<String, InputStream> in = new HashMap<String, InputStream>(); for(EsbWsdlFileV f : ewf){ //文件真实路径 String path = f.getServerAbsPath(); //生成的文件,如ESB_EOM_E12_ImportOrderUrgeInfoSrv/MsgHeader.xsd String zipPath = basePath.get(f.getServiceId()) + "/" + FilenameUtils.getName(path); try { in.put(zipPath, new FileInputStream(new File(path))); detail.append(f.getMd5CheckSum()).append("\t").append(zipPath).append("\n"); } catch (FileNotFoundException e) { logger.error(path + " not found..."); } } detail.append("\n"); detail.append(String.format("generated by project %s", SysConfigCache.getConfigByName(Constants.VERSION))).append("\n"); detail.append(String.format("%1$tF %1$tT", timestamp)).append("\n"); detail.append("Copyright (c) 2004-2013 A-Company").append("\n"); //logger.debug("zip files parm : " + in); try { in.put("md5checksum.txt", IOUtils.toInputStream(detail.toString(), "UTF-8")); } catch (IOException e1) { logger.error("can not generate file list..."); } // httpheader设置 response.setContentType("application/x-msdownload;"); response.setHeader("Content-disposition", "attachment; filename = export-wsdl-" + String.format("%1$tY%1$tm%1$td%1$tH%1$tM%1$tS", timestamp) + ".zip"); // 将wsdl文件压缩至请求流中 try { CompressionUtil.zip2(in, response.getOutputStream()); } catch (IOException e) { e.printStackTrace(); logger.error("exportWsdl zip error..."); } } logger.debug("exportWsdl end..."); }
2、工具类:
import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Map; import org.apache.tools.tar.TarEntry; import org.apache.tools.tar.TarOutputStream; import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipFile; import org.apache.tools.zip.ZipOutputStream; public class CompressionUtil { private static final int BUFFEREDSIZE = 1024; /** * 将文件解压缩到指定目录 * * @param srcFile * @param descDir * @throws IOException */ public static void unzip(File srcFile, String descDir) throws IOException { // 创建解压目录 new File(descDir).mkdirs(); ZipFile zipFile = new ZipFile(srcFile); String strPath, gbkPath, strtemp; File tempFile = new File(descDir); strPath = tempFile.getAbsolutePath(); @SuppressWarnings("rawtypes") java.util.Enumeration e = zipFile.getEntries(); while (e.hasMoreElements()) { org.apache.tools.zip.ZipEntry zipEnt = (ZipEntry) e.nextElement(); gbkPath = zipEnt.getName(); if (zipEnt.isDirectory()) { strtemp = strPath + File.separator + gbkPath; File dir = new File(strtemp); dir.mkdirs(); continue; } else { // 读写文件 InputStream is = zipFile.getInputStream(zipEnt); BufferedInputStream bis = new BufferedInputStream(is); gbkPath = zipEnt.getName(); strtemp = strPath + File.separator + gbkPath; // 建目录 String strsubdir = gbkPath; for (int i = 0; i < strsubdir.length(); i++) { if (strsubdir.substring(i, i + 1).equalsIgnoreCase("/")) { String temp = strPath + File.separator + strsubdir.substring(0, i); File subdir = new File(temp); if (!subdir.exists()) subdir.mkdir(); } } FileOutputStream fos = new FileOutputStream(strtemp); BufferedOutputStream bos = new BufferedOutputStream(fos); int c; while ((c = bis.read()) != -1) { bos.write((byte) c); } bos.close(); fos.close(); } } } /** * 解压指定路径的文件至指定目录 * * @param srcFilepath * @param descDir * @throws IOException */ public static void unzip(String srcFilepath, String descDir) throws IOException { File srcFile = new File(srcFilepath); unzip(srcFile, descDir); } /** * 解压文件到当前目录 * * @param srcFile * @throws IOException */ public static void unzip(File srcFile) throws IOException { unzip(srcFile, srcFile.getParent()); } /** * 解压指定路径的文件至当前目录 * * @param srcFilepath * @throws IOException */ public static void unzip(String srcFilepath) throws IOException { File srcFile = new File(srcFilepath); unzip(srcFile, srcFile.getParent()); } /** * 压缩zip格式的压缩文件 * * @param inputFile * 需压缩文件 * @param out * 输出压缩文件 * @param base * ZipEntry name * @throws IOException */ private static void zip(File inputFile, ZipOutputStream out, String base) throws IOException { if (inputFile.isDirectory()) { File[] inputFiles = inputFile.listFiles(); out.putNextEntry(new ZipEntry(base + "/")); base = base.length() == 0 ? "" : base + "/"; for (int i = 0; i < inputFiles.length; i++) { zip(inputFiles[i], out, base + inputFiles[i].getName()); } } else { if (base.length() > 0) { out.putNextEntry(new ZipEntry(base)); } else { out.putNextEntry(new ZipEntry(inputFile.getName())); } FileInputStream in = new FileInputStream(inputFile); try { int c; byte[] by = new byte[BUFFEREDSIZE]; while ((c = in.read(by)) != -1) { out.write(by, 0, c); } } catch (IOException e) { throw e; } finally { in.close(); } } } /** * 压缩zip格式的压缩文件 * * @param inputFile * 需压缩文件 * @param zipFilename * 输出文件及详细路径 * @throws IOException */ public static void zip(File inputFile, String zipFilename) throws IOException { ZipOutputStream out = new ZipOutputStream(new FileOutputStream( zipFilename)); try { zip(inputFile, out, ""); } catch (IOException e) { throw e; } finally { out.close(); } } /** * 压缩zip格式的压缩文件 * * @param inputFilename * 压缩的文件或文件夹及详细路径 * @param zipFilename * 输出文件名称及详细路径 * @throws IOException */ public static void zip(String inputFilename, String zipFilename) throws IOException { zip(new File(inputFilename), zipFilename); } /** * 压缩tar格式的压缩文件 * * @param inputFilename * 压缩文件 * @param tarFilename * 输出路径 * @throws IOException */ public static void tar(String inputFilename, String tarFilename) throws IOException { tar(new File(inputFilename), tarFilename); } /** * 压缩tar格式的压缩文件 * * @param inputFile * 压缩文件 * @param tarFilename * 输出路径 * @throws IOException */ public static void tar(File inputFile, String tarFilename) throws IOException { TarOutputStream out = new TarOutputStream(new FileOutputStream( tarFilename)); try { tar(inputFile, out, ""); } catch (IOException e) { throw e; } finally { out.close(); } } /** * 压缩tar格式的压缩文件 * * @param inputFile * 压缩文件 * @param out * 输出文件 * @param base * 结束标识 * @throws IOException */ private static void tar(File inputFile, TarOutputStream out, String base) throws IOException { if (inputFile.isDirectory()) { File[] inputFiles = inputFile.listFiles(); out.putNextEntry(new TarEntry(base + "/")); base = base.length() == 0 ? "" : base + "/"; for (int i = 0; i < inputFiles.length; i++) { tar(inputFiles[i], out, base + inputFiles[i].getName()); } } else { if (base.length() > 0) { out.putNextEntry(new TarEntry(base)); } else { out.putNextEntry(new TarEntry(inputFile.getName())); } FileInputStream in = new FileInputStream(inputFile); try { int c; byte[] by = new byte[BUFFEREDSIZE]; while ((c = in.read(by)) != -1) { out.write(by, 0, c); } } catch (IOException e) { throw e; } finally { in.close(); } } } /** * @param files <k, v> * k zip包中的路径 * v 待压缩的文件 * @param out 输出流 */ public static void zip(Map<String, File> files, OutputStream out) throws IOException { ZipOutputStream zos = new ZipOutputStream(out); for(String path : files.keySet()){ zip(files.get(path), zos, path); } zos.close(); } /** * 流压缩 * * @param in 输入流 * @param out 输出流 * @param name 压缩包中路径 * @throws IOException */ private static void zip(InputStream in, ZipOutputStream out, String name) throws IOException { out.putNextEntry(new ZipEntry(name)); try { int c; byte[] by = new byte[BUFFEREDSIZE]; while ((c = in.read(by)) != -1) { out.write(by, 0, c); } } catch (IOException e) { throw e; } finally { in.close(); } } /** * 流压缩 * * @param in * @param out * @throws IOException */ public static void zip2(Map<String, InputStream> in, OutputStream out) throws IOException { ZipOutputStream zos = new ZipOutputStream(out); for(String path : in.keySet()){ zip(in.get(path), zos, path); } zos.close(); } /* public static void main(String[] args) throws IOException { ZipOutputStream zos = new ZipOutputStream(new File("D:/btest/jjx.zip")); zip(new File("D:/atest/build.xml"), zos, "srv1/build.xml"); zip(new File("D:/atest/jaxws-custom.xml"), zos, "srv2/jaxws-custom.xml"); } */ }
。。
相关推荐
物联网实战项目
内容概要:文章介绍了基于Matlab的PSO-LSTM(粒子群算法优化长短期记忆神经网络)实现多输入分类预测的完整流程。针对大数据时代背景下金融、医疗、能源等行业面临的多变量时序数据分析挑战,传统机器学习方法难以有效捕捉数据间的时序依赖性和长期依赖关系。LSTM虽能很好应对长期依赖性问题,却因自身超参数优化难题限制性能发挥。为此,文中提出了融合PSO与LSTM的新思路。通过粒子群优化算法自动化选取LSTM的最优超参数配置,在提高预测精度的同时,加速模型训练过程。项目详细展示了该方法在金融预测、气象预报等多个领域的应用前景,并用具体代码实例演示了如何设计PSO-LSTM模型,其中包括输入层接收多输入特征、经由PSO优化超参数设定再进入LSTM层完成最终预测输出。 适用人群:从事机器学习、深度学习研究的专业人士或研究生,尤其是专注于时间序列数据挖掘以及希望了解如何利用进化算法(如PSO)优化神经网络模型的研究人员。 使用场景及目标:①对于具有多维度时序特性的数据集,本模型可用于精准分类预测任务;②旨在为不同行业的分析师提供一种高效的工具去解决实际问题中复杂的时变关系分析;③通过案例代码的学习使开发者掌握创建自己的PSO-LSTM模型的技术,从而实现在各自专业领域的高准确性预测。 其他说明:需要注意的是,在具体实施PSO-LSTM算法过程中可能会遇到诸如粒子群算法的收敛问题、LSTM训练中的梯度管理以及数据集质量问题等挑战,文中提及可通过改进优化策略和加强前期准备工作予以解决。此外,由于计算成本较高,还需考虑硬件设施是否足够支撑复杂运算需求。
三菱FX5U PLC与台达DT330温控器通讯程序:实现设定温度、读取温度及输出启停控制功能的稳定可靠解决方案,三菱FX5U与台达DT330温控器通讯程序详解:通过PLC与触摸屏实现精确温度控制与启停操作,三菱FX5U与台达DT330温控器通讯程序+输出启停控制(SL5U-9) 功能:通过三菱FX5U本体485口,结合触摸屏网口,实现对台达DT330温控器 设定温度,读取温度,输出启停控制。 反应灵敏,通讯稳定可靠。 器件:三菱FX5U PLC,台达DT330温控器,昆仑通态TPC7022NI触摸屏。 说明:的是程序,带注释,带温控器手册,接线,参数设置都提供。 通讯稳定可靠,实用有效。 ,三菱FX5U; 通讯程序; 输出启停控制; 温度控制; 触摸屏接口; 温控器手册; 参数设置。,三菱FX5U与台达DT330温控器通讯启停控制程序
内容概要:本文介绍了论文“Efficient Cooperative Spectrum Sensing in UAV-Assisted Cognitive Wireless Sensor Networks”的复现实现,重点涉及系统模型建立、信号检测与投票规则的实现及其仿真实验。文章提供了四个关键组成部分的具体实现步骤:首先是参数设置,包括仿真参数的配置;接着是信号模型与能量检测,涵盖信号的存在与否的判定逻辑;第三部分是实现四种投票规则(CVR、SVR、S1 和 DS1)的细节;最后一部分展示了仿真实验的方法,并通过绘制检测性能图和样本大小图来比较不同投票规则的效用。 适用人群:适用于具有基本编程能力并且对无线传感网络频谱感知研究感兴趣的科研人员和技术爱好者。 使用场景及目标: ① 探索不同频谱感知投票规则的表现; ② 提供具体的编程范例帮助理解和实施合作频谱感知道; ③ 分析多种投票算法下的最优方案; ④ 评估无人机辅助环境下频谱检测的实际效果。 其他说明:本文不仅实现了原始论文的技术路线,还探讨了一些可能的改进方向,如增强信号模型、分析投票规则复杂度、参数灵敏性分析、引入机器学
win32汇编环境,窗口程序使用树形视图示例二
公司年会抽奖程序可定制化的抽奖应用,炫酷3D球体,可用于年会抽奖等活动,支持奖品、人员、界面、图片音乐配置。
COMSOL模拟锂枝晶生长过程:电势场与流场耦合影响枝晶形貌,基于Comsol模拟的锂枝晶生长与流场耦合电势场模型:浓度场变化对枝晶形貌的影响研究,comsol 锂枝晶加流动耦合电势场模型,浓度场生长过程中添加流场,改变枝晶形貌。 ,关键词:COMSOL; 锂枝晶; 流动耦合; 电势场模型; 浓度场生长; 流场控制; 枝晶形貌变化。,COMSOL锂枝晶流场耦合电势模型
TM_TM104SDHG30_V2.0
物联网云平台基础架构_Shiro权限管理_通用CURD_服务_1741161944
智能家居_Qt_跨平台客户端_家居管理_1741167066.zip
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
使用delphi 12 实现的走马灯
基于标准IEEE 33节点配电网的Simulink建模:有参考文献及数据来源,可输出节点电压电流数据用于潮流计算与风光并网研究,基于标准IEEE 33节点配电网的Simulink建模:数据驱动的潮流计算与风光并网研究,标准IEEE33节点配电网, simulink建模,有参考文献,有数据来源。 可输出节点电压、电流数据,适用于潮流计算,在此基础上可实现风光并网研究。 ,核心关键词:标准IEEE33节点配电网; Simulink建模; 参考文獻; 数据来源; 输出节点电压电流数据; 潮流计算; 风光并网研究。,IEEE33节点配电网Simulink建模:数据驱动的潮流计算与风光并网研究
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
物联网实战项目
三菱FX3U与欧姆龙E5CC温控器通讯实战:全方位控制及稳定通讯程序,三菱FX3U与欧姆龙E5CC温控器通讯实战:多功能设置与监控程序实战操作,PLC通讯调试解析,三菱FX3U与欧姆龙E5CC温控器通讯实战程序 功能:通过昆仑通态触摸屏,三菱FX3U 485BD板,实现对欧姆龙E5CC温控器 设定温度值,读取实际温度,设定探头类型,设定报警值,设定报警类型,报警上下限功能。 反应灵敏,通讯稳定可靠。 器件:三菱FX3U PLC,FX3U 485BD,欧姆龙E5CC RX2ASM 802温控器,昆仑通态TPC7062KD触摸屏。 附送威纶通程序 说明:是程序,带注释,带温控器手册,接线,参数设置都提供。 通讯稳定可靠,实用有效。 ,核心关键词:三菱FX3U; 欧姆龙E5CC温控器; 昆仑通态触摸屏; 485BD板; 设定温度值; 读取实际温度; 探头类型设定; 报警值设定; 报警类型设定; 报警上下限功能; 通讯稳定可靠; 威纶通程序; 参数设置。,三菱FX3U与欧姆龙E5CC温控器通讯程序:实现温度控制与报警功能的实战指南
基于Boost型PFC与移相全桥AC-DC电源设计的仿真研究:前级PFC平均电流控制与后级移相控制技术分析,基于Boost型PFC与移相全桥AC-DC电源设计仿真——10kW功率的电压可调600V电源系统设计与应用,基于Psim的Boost型 PFC+移相全桥AC-DC电源设计仿真 1、前级电网输入220AC,50Hz,中间级母线电压为600V,后级600V输入,547V输出,电压可调,功率10kW 2、前级基于Boost电路PFC,平均电流控制,电压电流双闭环 3、后级全桥内移相和不控整流,移相控制,单电压环 4、有简要的电路参数设计 ,基于Psim的Boost型PFC; 移相全桥AC-DC电源设计; 220AC输入; 50Hz; 600V母线电压; 电压可调的10kW功率输出; Boost电路PFC; 平均电流控制; 电压电流双闭环控制; 全桥内移相控制; 不控整流; 移相控制单电压环; 电路参数设计。,基于Boost型PFC与移相全桥AC-DC电源设计的仿真研究
NewLifeX_NewLifeIoT_1741166206.zip
Pem电解槽三维仿真模型:氢气扩散与多孔介质流动态模拟研究,不涉及阴极水路与水电解槽节点分析,Pem电解槽三维仿真模型:氢气扩散与多孔介质流模拟研究,无阴极通水与二次电流分布的浓物质传递分析,Pem电解槽三维仿真模型,阴极不通水,只考虑氢气的扩散,使用二次电流分布浓物质传递自由与多孔介质流,不使用水电解槽节点。 ,核心关键词:Pem电解槽;三维仿真模型;阴极不通水;氢气扩散;二次电流分布;浓物质传递;多孔介质流;不使用水电解槽节点。,Pem电解槽三维模型:氢气扩散、二次电流浓物质传递研究