ZipUtils 痛定思痛。 2022-03-09 07:05 95阅读 0赞 import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.util.Enumeration; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import java.util.zip.ZipOutputStream; public class ZipUtils { private static final int BUFFER_SIZE = 2 * 1024; private static final int buffer = 2048; public static void main(String[] args) throws RuntimeException, IOException { //压缩文件放置处 //FileOutputStream fos1 = new FileOutputStream(new File("D:/weatherArea.zip")); //压缩文件 //ZipUtils.toZip("D:\\weatherUpload\\20181010", fos1,true); //解压zip unZip("D:\\DNA Developer.zip"); } public static void toZip(String srcDir, OutputStream out, boolean KeepDirStructure) throws RuntimeException, IOException{ long start = System.currentTimeMillis(); ZipOutputStream zos = null ; try { zos = new ZipOutputStream(out); File sourceFile = new File(srcDir); compress(sourceFile,zos,sourceFile.getName(),KeepDirStructure); long end = System.currentTimeMillis(); System.out.println("压缩完成,耗时:" + (end - start) +" ms"); } catch (Exception e) { throw new RuntimeException("zip error from ZipUtils",e); }finally{ if(zos != null){ zos.close(); } } } /** * 递归压缩方法 * @param sourceFile 源文件 * @param zos zip输出流 * @param name 压缩后的名称 * @param KeepDirStructure 是否保留原来的目录结构,true:保留目录结构; * false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败) * @throws Exception */ private static void compress(File sourceFile, ZipOutputStream zos, String name, boolean KeepDirStructure) throws Exception{ byte[] buf = new byte[BUFFER_SIZE]; if(sourceFile.isFile()){ // 向zip输出流中添加一个zip实体,构造器中name为zip实体的文件的名字 zos.putNextEntry(new ZipEntry(name)); // copy文件到zip输出流中 int len; FileInputStream in = new FileInputStream(sourceFile); while ((len = in.read(buf)) != -1){ zos.write(buf, 0, len); } // Complete the entry zos.closeEntry(); in.close(); } else { File[] listFiles = sourceFile.listFiles(); if(listFiles == null || listFiles.length == 0){ // 需要保留原来的文件结构时,需要对空文件夹进行处理 if(KeepDirStructure){ // 空文件夹的处理 zos.putNextEntry(new ZipEntry(name + "/")); // 没有文件,不需要文件的copy zos.closeEntry(); } }else { for (File file : listFiles) { // 判断是否需要保留原来的文件结构 if (KeepDirStructure) { // 注意:file.getName()前面需要带上父文件夹的名字加一斜杠, // 不然最后压缩包中就不能保留原来的文件结构,即:所有文件都跑到压缩包根目录下了 compress(file, zos, name + "/" + file.getName(),KeepDirStructure); } else { compress(file, zos, file.getName(),KeepDirStructure); } } } } } /** * 解压Zip文件 * @param path 文件目录 */ public static void unZip(String path) { int count = -1; String savepath = ""; File file = null; InputStream is = null; FileOutputStream fos = null; BufferedOutputStream bos = null; savepath = path.substring(0, path.lastIndexOf("\\")) + File.separator; //保存解压文件目录 ZipFile zipFile = null; try { zipFile = new ZipFile(path); //解决中文乱码问题 Enumeration<?> entries = zipFile.entries(); while(entries.hasMoreElements()) { byte buf[] = new byte[buffer]; ZipEntry entry = (ZipEntry)entries.nextElement(); String filename = entry.getName(); boolean ismkdir = false; if(filename.lastIndexOf("/") != -1){ //检查此文件是否带有文件夹 ismkdir = true; } filename = savepath + filename; if(entry.isDirectory()){ //如果是文件夹先创建 file = new File(filename); file.mkdirs(); continue; } file = new File(filename); if(!file.exists()){ //如果是目录先创建 if(ismkdir){ new File(filename.substring(0, filename.lastIndexOf("/"))).mkdirs(); //目录先创建 } } file.createNewFile(); //创建文件 is = zipFile.getInputStream(entry); fos = new FileOutputStream(file); bos = new BufferedOutputStream(fos, buffer); while((count = is.read(buf)) > -1) { bos.write(buf, 0, count); } bos.flush(); InputStreamReader isr = new InputStreamReader(new FileInputStream(file)); BufferedReader br = new BufferedReader(isr); String lineTxt = null; while ((lineTxt = br.readLine()) != null) { System.out.println(lineTxt); } br.close(); bos.close(); fos.close(); is.close(); } zipFile.close(); }catch(IOException ioe){ ioe.printStackTrace(); }finally{ try{ if(bos != null){ bos.close(); } if(fos != null) { fos.close(); } if(is != null){ is.close(); } if(zipFile != null){ zipFile.close(); } }catch(Exception e) { e.printStackTrace(); } } } }
相关 使用hutool工具(ZipUtil)对多文件打包压缩并通过浏览器下载 使用hutool工具对多文件进行打包压缩并下载 需求 工作中遇到需要将详情页面数据导出为word,同时详情中有图片和附件,由于附件没法写入到word中(可能是自己没 矫情吗;*/ 2024年03月29日 16:26/ 0 赞/ 104 阅读
相关 Java压缩和解压文件工具类ZipUtil 用于服务器端打包文件的,将压缩后的文件写入到response输出流即可实现在服务器端打包下载,支持多级目录嵌套。 测试时可以先用ZipUtil.zip压缩某个文件夹test 谁践踏了优雅/ 2024年02月17日 18:42/ 0 赞/ 60 阅读
相关 ZipUtil java zip文件处理工具类 public class ZipUtil { public final static int BUFFER_SIZE = 10240; 淩亂°似流年/ 2022年12月05日 16:26/ 0 赞/ 143 阅读
相关 ZipUtil 压缩包工具类 项目中会用到下载文件功能,有的文件过大,这时需要将文件进行压缩成,然后进行下载操作,这样做的好处 1. 降低文件大小,加快下载速度 2. 安全性更高 下面的ZipUt 缺乏、安全感/ 2022年06月06日 08:06/ 0 赞/ 297 阅读
相关 文件解压缩工具类ZipUtil package com.imooc.test; import java.io.File; import java.io.FileInputSt 痛定思痛。/ 2022年04月12日 10:30/ 0 赞/ 247 阅读
相关 ZipUtils import java.io.BufferedOutputStream; import java.io.BufferedReader; import j 痛定思痛。/ 2022年03月09日 07:05/ 0 赞/ 96 阅读
还没有评论,来说两句吧...