从zip中读取文件 合并到指定的文件中

从zip中读取文件 合并到指定的文件中

引入 commons-io 版本可以选择更高的版本

   <dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.4</version></dependency>

具体代码如下:

package work;import java.io.*;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;/*** @author  qianxl*/
public class ZipCopyTools {public static void batchCopyZipContentToDirectory(String[] source, String des) {InputStream in = null;ZipInputStream zin = null;try {for (String src : source) {//读取文件路径//String path = "C:\\Users\\Administrator\\Desktop\\sql改造\\sql改造补丁\\medext_mm\\temp\\patch_mmmps_medext_1622031243072.zip";String path = src;//存储文件目录路径//String des = "C:/Users/Administrator/Desktop/sql改造/desc/";ZipFile zf = new ZipFile(path);//获取zip 文件格式String zipEncode = getCharsetFromSourceFile(path);System.out.println(zf.getName() + zipEncode + "fileEncode");// 文件输入流in = new BufferedInputStream(new FileInputStream(path));// zip文件的编码格式Charset charset = Charset.forName(zipEncode);// This class implements an input stream filter for reading files in the ZIP file format.zin = new ZipInputStream(in, Charset.forName(zipEncode));// 压缩文件实体ZipEntry ze;String zipDirectory = path.substring(0, path.lastIndexOf("."));while ((ze = zin.getNextEntry()) != null) {// 压缩文件的绝对路径//String zipFilePath = zipDirectory +"/"+ ze.toString();// 获取.class .java 文件的压缩格式// String fileEncode = getCharsetFromSourceFile(zipFilePath);String fileEncode =zipEncode;if (ze.toString().endsWith("java") || ze.toString().endsWith("class")) {BufferedReader br = new BufferedReader(new InputStreamReader(zf.getInputStream(ze), fileEncode));//String fieldPath = ze.getName().toString();//获取zip文件路径path = fieldPath;// 获取压缩文件 .java .class 的路径String directory = fieldPath.substring(0, fieldPath.lastIndexOf("/"));//创建文件夹boolean mkdirs = new File(des + directory).mkdirs();// 目的文件.class .java 文件的路径path = des + path;BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(path)), fileEncode));String line;while ((line = br.readLine()) != null) {System.out.println(line.toString());bw.write(line.toString());bw.write(System.getProperties().getProperty("line.separator"));}bw.flush();bw.close();br.close();}System.out.println();}zin.closeEntry();}} catch (IOException e) {e.printStackTrace();} finally {close(zin, in);}}public static void main(String[] args) {String des = "C:/Users/Administrator/Desktop/desc/";//String source = String filedesc = "C:\\Users\\Administrator\\Desktop\\descfile\\";List<File> fileList = new ArrayList<>();List<File> zips = getSuffixFilePaths(fileList, filedesc, "zip");// 返回 zip 文件数组值// System.out.println(zips.get(0).getAbsoluteFile());String[] src = zips.stream().map(p -> {return getAvailablePath(p);}).toArray(String[]::new);batchCopyZipContentToDirectory(src, des);}/*** getFileDirectory** @param fileList* @Return getFileDirectory <java.util.List<java.lang.String>>*/public static List<String> getFileDirectory(List<File> fileList) {fileList.stream().forEach(p -> {p.getPath().substring(0, p.getPath().lastIndexOf("/"));});return null;}/*** 获取文件编码** @param fileName* @return* @throws IOException https://my.oschina.net/davz/blog/4470673*/private static String getCharsetFromSourceFile(String fileName) throws IOException {BufferedInputStream bin = new BufferedInputStream(new FileInputStream(fileName));int p = (bin.read() << 8) + bin.read();String code = null;switch (p) {case 0xefbb:code = "UTF-8";break;case 0xfffe:code = "Unicode";break;case 0xfeff:code = "UTF-16BE";break;default:code = "GBK";}return code;}/*** 关闭给定的io流** @url https://blog.csdn.net/u012250875/article/details/78341874*/public static void close(Closeable... closes) {for (Closeable closeable : closes) {try {if (closeable != null) {closeable.close();}} catch (IOException e) {e.printStackTrace();}}}/*** getAvailablePath* *@param  file** @Return getAvailablePath <java.lang.String>*/private static String getAvailablePath(File file) {return file.getPath().replace('\\', '/');}/*** getSuffixFilePaths** @param fileList* @param path* @param fileSuffix* @Return getSuffixFilePaths <java.util.List<java.io.File>>*/public static List<File> getSuffixFilePaths(List<File> fileList, String path, String fileSuffix) {File file = new File(path);File[] files = file.listFiles();if (files == null) {return null;} else {for (int i = 0; i < files.length; i++) {// 判断是否是文件夹if (files[i].isDirectory()) {// 递归调用getFiles方法,得到所有的文件getSuffixFilePaths(fileList, getAvailablePath(files[i]), fileSuffix);// 只处理fileSuffix后缀的文档} else if (files[i].getName().lastIndexOf(fileSuffix) != -1) {// copyFileAndAddPackageName(files[i]);// 添加到文件集合中fileList.add(files[i]);}/// System.out.println(files[i].getAbsolutePath().replace('//',/// '/'));}}return fileList;}// 读取xml 文件 并将xml 文件中的文件}/*** 文件的路径* @param fileName*/// 堆栈方式实现public static void loopDeleteFields(File fileName) {Stack<File> stack = new Stack<>();// 存储文件夹Stack<File> stackDir= new Stack<>();// stack 初始化stack.add(fileName);stackDir.add(fileName);while (!stack.isEmpty()) {// 弹出fileFile file = stack.pop();File[] files = file.listFiles();if (files != null && files.length > 0) {for (File f : files) {if (f.isDirectory()) {stack.add(f);//存储文件夹  先进后出 FILOstackDir.add(f);} else {f.delete();}}}}// 删除文件夹while (!stackDir.isEmpty()){File file = stackDir.pop();file.delete();}// System.out.println("删除--");}

参考的博客 1 .

参考的博客 2

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

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

相关文章

【OS学习笔记】四 什么是虚拟机

虚拟机是软件 对于第一次听说虚拟机&#xff08;Virtual Machine&#xff0c;VM&#xff09;的人来说&#xff0c;可能以为还要再花钱买一台计算机&#xff0c;这恐怕是他们最担心的。所谓虚拟机&#xff0c;就是在你的计算机上再虚拟出另一台计算机来。这台虚拟出来的计算机&…

TCP/IP协议族之运输层(TCP流量控制和拥塞控制 [1])

TCP的流量控制 1. 利用滑动窗口实现流量控制 如果发送方把数据发送得过快&#xff0c;接收方可能会来不及接收&#xff0c;这就会造成数据的丢失。所谓流量控制就是让发送方的发送速率不要太快&#xff0c;要让接收方来得及接收。 利用滑动窗口机制可以很方便地在TCP连接上实现…

英语词源记忆法

英语词源记忆法后续持续更新中

【OS学习笔记】五 VirtualBox的下载、安装和配置

上一篇文章学习了&#xff1a;计算机的启动过程&#xff08;点击链接查看上一篇文章&#xff09; 今天来接着上一篇文章&#xff0c;解决我们学习中的实验环境问题。 参考&#xff1a;X86汇编语言-从实模式到保护模式。作者李忠。纯学习笔记。如有侵权请联系我删除 1、下载O…

iframe透明

<iframe allowtransparency"true" src"A.html"></iframe> A.html body { background-color:transparent; } 转载于:https://www.cnblogs.com/mattins/archive/2010/10/13/1850098.html

spring体系思维导图

spring体系思维导图1. spring 思维导图2. springboot 思维导图3. springcloud 思维导图之前整理的&#xff0c;后续持续更新中1. spring 思维导图 2. springboot 思维导图 3. springcloud 思维导图

【数据结构与算法-java实现】一 复杂度分析(上):如何分析、统计算法的执行效率和资源消耗?

今天开始学习程序的灵魂&#xff1a;数据结构与算法。 本文是自己学习极客时间专栏-数据结构与算法之美后的笔记总结。如有侵权请联系我删除文章。 我们都知道&#xff0c;数据结构和算法本身解决的是“快”和“省”的问题&#xff0c;即如何让代码运行得更快&#xff0c;如何…

sleep和wait的区别

考中2次了&#xff0c;再错第三次&#xff0c;我改姓&#xff01;天天笔试面试连轴转&#xff0c;查错的心情都没有&#xff01;不能再笨下去了&#xff01; from&#xff1a;http://nneverwei.javaeye.com/blog/494280 http://zhidao.baidu.com/question/75503928.html?frala…

idea模板

idea模板1.类注解模板2.方法注解模板3.自定义代码生成模板每次下载新版本的idea 或者换笔记本都需要重新&#xff0c;配置注解&#xff0c;而且从网上找了很多都或多或少有问题&#xff0c;每次要花费一些时间配置&#xff0c;这里整理一下。自定义代码生成模版&#xff0c;设置…

【OS学习笔记】六 实模式:编写主引导扇区代码

上一篇文章学习了&#xff1a;计算机的启动过程&#xff08;点击链接查看上一篇文章&#xff09; 这篇文章学习记录为&#xff1a;编写主引导扇区代码。 参考&#xff1a;《X86汇编语言-从实模式到保护模式》-李忠。纯学习笔记&#xff0c;更详细内容请阅读正版书籍。如有侵权…

秘罗地伤痕 -- 暂存小说草稿

六月的山城重庆热的让人发疯&#xff0c;远远看去&#xff0c;好像路上的青条石都要融化了似的。树梢也一动不动&#xff0c;似乎 在守卫着什么&#xff0c;坚定的站在自己的位置上。倒是走在这条路上的行人很是奇怪。这四个黑衣人&#xff0c;每人穿 一身高档礼服呢的西装&…

【OS学习笔记】七 Bochs的下载、安装和配置

参考&#xff1a;《X86汇编语言-从实模式到保护模式》-李忠。纯学习笔记&#xff0c;更详细内容请阅读正版书籍。 1 开源的BOCHS虚拟机软件 Bochs是开源软件。它用软件来模拟处理器取指令和执行指令的过程&#xff0c;以及整个计算机硬件。当它开始运行时&#xff0c;就直接模…

【OS学习笔记】八 实模式:编写主引导扇区代码-另一种更高效的写法

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 上一篇文章&#xff0c;我们用比较原始的方法编写了主引导扇区的代码。点击链接查看上一篇文章&#xff1a;编写主引导扇区代码 本片文章将学习以下内…

命名习惯

写程序经常需要命名&#xff0c;好的名字至少可以带来更清晰的代码&#xff0c;进一点还可以带来更好的设计和架构。但看过很多程序&#xff0c;发现很多命名都不是很合适。下面是我总结的一些命名原则:1. 提取公共部分, 减少不必要的重复&#xff08;no repeate)。 一堆…

【OS学习笔记】九 实模式:从汇编的角度理解栈结构

上一篇文章以一种更加高效的方法编写了主引导扇区的代码。主要是引入了循环和跳转指令。点击链接查看上一篇文章&#xff1a;编写主引导扇区代码-另一种更高效的写法 本篇文章&#xff0c;继续上一篇文章的学习。同样还是编写汇编代码加载到主引导扇区让CPU直接执行。但是我们…

链接库注意事项

1、确定include路径设置正确。 2、确定lib路径设置正确。 3、确定在连接器上加入需要连接的库名字。 4、由于库可能是Win平台&#xff08;lib/dll&#xff09;或者是Linux平台&#xff08;a/so&#xff09;&#xff0c;使用编译器时需注意库的格式是否与编译器所在平台对应。 5…

【OS学习笔记】十 实模式:实现一个程序加载器-程序加载器如何将用户程序加载到内存并执行

上一篇文章学习了以下内容&#xff1a; 用一种不同的分段方法&#xff0c;从另一个不同的的角度理解处理器的分段内存访问机制使用循环和条件转移指令来优化主引导扇区代码 点击链接查看上一篇文章&#xff1a;点击链接查看 对于主引导扇区部分。大概前几篇文章已经学的差不…

ASP.NET生成WORD文档服务器部署注意事项

1、Asp.net 2.0在配置Microsoft Excel、Microsoft Word应用程序权限时 error: 80070005 和8000401a 的解决总 2007-11-01 11:30 检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件时失败&#xff0c;原因是出现以下错误: 80070005。 控制面板&#…

【OS学习笔记】十一 实模式:中断-软中断和硬中断基本原理

上一篇文章我们模拟操作系统的加载器程序&#xff0c;使用汇编语言实现了一个程序加载器&#xff1a;点击链接查看上一篇文章&#xff1a;程序加载器的实现原理 本篇文章&#xff0c;是实模式学习的结尾。在经过了那么多坎坷&#xff0c;终于学完了8086的实模式&#xff01;&a…