java 实现zip 压缩 解压 (目录控制)

简介: java 实现zip 压缩 解压 (目录控制)

直接上代码

import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
//zip操作
public class ZipDemo {
    //目录名称
    private static String driName =null;
    //压缩后是否包含最外层的目录 
    private static Boolean delOutside = false;
    public static String getDriName() {
        return driName;
    }
    public static void setDriName(String driName) {
        ZipDemo.driName = driName;
    }
    public static Boolean getDelOutside() {
        return delOutside;
    }
    public static void setDelOutside(Boolean delOutside) {
        ZipDemo.delOutside = delOutside;
    }
    /**
     * 压缩
     * @param outFile 文件输出的地址
     * @param targetFile 需要压缩的目录
     * @param isDelOutside 压缩后是否包含最外层的目录 true 包含 false 不包含
     */
    private static void compression(String outFile, File targetFile,Boolean isDelOutside) {
        System.out.println("压缩进行中");
        long start = System.currentTimeMillis();
        delOutside = isDelOutside;
        BufferedOutputStream bos = null;
        try {
            if (!targetFile.exists()) {
                System.out.println("文件地址不存在");
                return;
            }
            ZipOutputStream zOut = new ZipOutputStream(new FileOutputStream(outFile));
            bos = new BufferedOutputStream(zOut);
            driName = targetFile.getName();
            zip(zOut, targetFile, driName, bos);
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            if (bos != null) {
                try {
                    bos.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }
        long end = System.currentTimeMillis();
        System.out.println("压缩完成,耗时:" + (end - start) + " ms");
        System.out.println("压缩完成");
    }
    private static void zip(ZipOutputStream zOut, File targetFile, String name, BufferedOutputStream bos) throws IOException {
        if (targetFile.isDirectory()) {
            File[] files = targetFile.listFiles();
            //判断是否为空目录
            if (files.length == 0) {
                zOut.putNextEntry(new ZipEntry(name + "/"));
            } else {
                //目录递归调用
                for (File file : files) {
                    zip(zOut, file, name + "/" + file.getName(), bos);
                }
            }
        } else {
            if(!delOutside){
                name = name.replaceFirst(driName+"/","");
            }
            zOut.putNextEntry(new ZipEntry(name));
            InputStream in = new FileInputStream(targetFile);
            BufferedInputStream bis = new BufferedInputStream(in);
            //将源文件写入到zip文件中
            byte[] bytes = new byte[1024];
            int len = -1;
            while ((len = bis.read(bytes)) != -1) {
                bos.write(bytes, 0, len);
            }
            bis.close();
        }
    }
    //解压
    private static void decompression(String targetFileName, String parent) {
        try {
            File targetFile = new File(targetFileName);
            if(!targetFile.exists()){
                System.out.println("文件地址不存在");
            }
            ZipInputStream zis = new ZipInputStream(new FileInputStream(targetFile));
            ZipEntry entry = null;
            File file = null;
            while ((entry = zis.getNextEntry()) != null && !entry.isDirectory()) {
                file = new File(parent, entry.getName());
                if (!file.exists()) {
                    new File(file.getParent()).mkdirs();
                }
                FileOutputStream fos = new FileOutputStream(file);
                BufferedOutputStream bos = new BufferedOutputStream(fos);
                int len = -1;
                byte[] bytes = new byte[1024];
                while ((len = zis.read(bytes)) != -1) {
                    bos.write(bytes, 0, len);
                }
                System.out.println(file.getAbsoluteFile() + "解压完成");
                bos.close();
            }
            System.out.println("解压结束");
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
    public static void main(String[] args) {
        //压缩调用
        compression("F:\\1.zip", new File("F:\\测试"),true);
        //解压调用
//        decompression("F:\\1.zip", "F:\\测试\\");
    }
}

注意点

压缩的方法有一个isDelOutside参数,是用来控制是否将最外层的目录压缩进去的。

例如:

目录结构

8.png

isDelOutside=true时,包含最外层的目录

9.png

isDelOutside=true时,不包含最外层的目录

10.png

相关文章
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
|
SQL JavaScript 安全
【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战
【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战
560 11
【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战
|
分布式计算 Java Hadoop
linux中HADOOP_HOME和JAVA_HOME删除后依然指向旧目录
通过以上步骤,可以有效地解决 `HADOOP_HOME`和 `JAVA_HOME`删除后依然指向旧目录的问题。确保在所有相关的配置文件中正确设置和删除环境变量,并刷新当前会话,使更改生效。通过这些措施,能够确保系统环境变量的正确性和一致性。
320 1
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
1049 4
|
安全 Java Android开发
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
693 5
|
安全 Java Android开发
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
520 2
|
设计模式 Java
【玩转23种Java设计模式】学习目录汇总整理
软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。
【玩转23种Java设计模式】学习目录汇总整理
|
安全 Java
Java学习目录
基础 Java 比较器Comparator和Comparable的使用和区别 进制、移位 Java 移位运算详解(2进制+原码+反码+补码) Thread线程 Java Thread线程使用、线程安全(一) ...
972 0
|
5月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
278 1
|
5月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
299 1