ZIP压缩与解压缩(只有代码)

news/2024/7/5 19:26:13

ZIP压缩与解压缩

  • 主要使用类
  1. ZipEntry
  2. ZipInputStream
  3. ZipOutputStream
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

public class zip{
    private static void xxx(){
        // 源文件(夹)
        File file = new File("E:\\你的盘里的文件路径");
        // 目标 zip 文件
        File target = new File("E:\\name.zip");
        try(
                // 创建文件输出流
                FileOutputStream fileOutputStream = new FileOutputStream(target);
            // 传入的是最终产生的 zip 文件
            ZipOutputStream zipOutputStream = new ZipOutputStream(fileOutputStream)){
            System.out.println("压缩中...");
            // 判断此文件是否是文件夹
            if(file.isDirectory()) {
                // 遍历文件夹里的文件
                for (File file1 : file.listFiles()) {
                    // 调用方法压缩文件
                    zip(zipOutputStream, file1, "");
                }
            }else{
                // 调用方法,压缩文件
                zip(zipOutputStream, file, "");
                // base 路径
            }
            System.out.println("压缩成功.");
            // 捕捉异常
        }catch (IOException e){
            e.printStackTrace();
        }
    }

    /**
     * 压缩文件
     * @param zipOutputStream 文件压缩流
     * @param file 需要压缩的文件
     * @param base 路径 - 添加条目需要
     */
    private static void zip(ZipOutputStream zipOutputStream,File file,String base){
        // 判断文件是否是文件夹
        if(file.isDirectory()){
            // 遍历文件夹里的文件
            for(File file1 : file.listFiles()) {
                // 递归调用
                // base:路径 getName:获取文件名  File.separator :获取分割符号
                zip(zipOutputStream, file1, base + file1.getName() + File.separator);
            }
        }else{
            // 处理文件 - 不是文件夹
            try {
                // 添加条目
                zipOutputStream.putNextEntry(new ZipEntry(base));
                // 用于遍历输入
                int count = -1;
                // 存储数据
                byte[] bytes = new byte[1024];
                // 创建文件输入流
                FileInputStream fileInputStream = new FileInputStream(file);
                // 传入数据
                // 先利用文件输入流将文件中的信息提取出来,然后在使用 zip输出流输出到 zip 文件中
                while((count = fileInputStream.read(bytes)) != - 1){
                    // 输出数据
                    zipOutputStream.write(bytes);
                    // 刷新
                    zipOutputStream.flush();
                }
                // 关闭流
            }catch (IOException e){
                e.printStackTrace();
            }
        }
    }

    /**
     * 压缩文件
     */
    private static void deprogress(){
        // 压缩包
        File file = new File("E:\\name.zip");
        // 解压后文件存储的地方
        File file1 = new File("E:\\解压");
        // 用于从 zip 文件中读出数据然后写入到其它文件中
        byte[] bytes = new byte[1024];
        // 用于获取条目
        ZipEntry zipEntry = null;
        try(
                FileInputStream fileInputStream = new FileInputStream(file);
                // 用于解压 zip 文件
            ZipInputStream zipInputStream = new ZipInputStream(fileInputStream)){
            while(true){
                // 获取下一个条目,跳过根
                zipEntry = zipInputStream.getNextEntry();
                // 为空的情况
                if(zipEntry == null){ break; }
                // 如果是目录
                if(zipEntry.isDirectory()){ continue; }
                // 创建文件
                File f = new File(file1,zipEntry.getName());
                // 如果文件的父文件不存在
                if(!f.getParentFile().exists()){
                    // 创建目录
                    f.getParentFile().mkdirs();
                }
                int count = -1;
                // 创建文件输出流
                FileOutputStream fileOutputStream = new FileOutputStream(f);
                // 将从 zip 文件条目中读取的信息写入到此文件中
                while((count = zipInputStream.read(bytes)) != -1){
                    // 输出数据
                    fileOutputStream.write(bytes,0,count);
                }
                // 关闭压缩输入流
                zipInputStream.closeEntry();
            }
            //异常处理
        }catch (IOException e){
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        // 调用方法,压缩文件
        xxx();
        System.out.println("解压中...");
        // 调用方法,解压缩文件
        deprogress();
        System.out.println("解压完成");
    }
}


http://www.niftyadmin.cn/n/4557813.html

相关文章

mysql jar包下载导入与Loading class `com.mysql.jdbc.The new driver class is `com.mysql.cj.jdbc.Driver‘.问题解决

mysql数据库连接 下载 下载网址:https://dev.mysql.com/downloads/ java下载红框标的。 我是下载 ZIP文件的 在Java中导入jar包 在Project Structure中导入,选择 Libraries 点击 号并选择需要导入的Module 打开快捷键 :Ctrl Shift Alt …

C语言

cid9D5E17E1B02857A563F3CDE2C79A42B54B1F5FB9&t13&fmt-这个是用迅雷下的下一个迅雷在点击下载文件是csf格式直接去下一个csf格式播放器就可以播放了 当然要用软件啦Turbo C这个就可以了教程:http://119.147.41.16/down

C#截取字符串 200分 求答案

3); s1.LastIndexOf(".txt")); ||| s1.Substring(0 s1.Substring(0

2018.5.26 做了点attacklab

只做了第一套热身题,就是通过覆盖返回地址来强制执行另外一个准备好的函数,不过光这个热身题就搞得够呛。。。主要是花了很多时间读lab文档,最后总算上手,不容易。。。转载于:https://www.cnblogs.com/dynasty919/p/9094899.html

新博客的第一篇博文~

偷偷溜到这里建一个小窝~ 也欢迎到我的原博客~传送门 转载于:https://www.cnblogs.com/Menteur-Hxy/p/9095625.html

VS Code 运行C/C++ 程序

安装 VS Code 下载地址:Download Visual Studio Code - Mac, Linux, Windows 安装 C/C编译器 下载地址:Download MinGW-w64 - for 32 and 64 bit Windows from SourceForge.net 网盘:https://pan.baidu.com/s/1il3nNPaMeU5HITatFp3v7A 提…

谢谢 关于电脑VB的一些题

( 不太确定)为了改变计时器控件的时间间隔 一个窗体得到焦点时 B GotFocus 事件Interval 属性Timer 事件 B9 A8 A4 D3 C2 B 答案补充 在程序运行当中 计时器控件能有规律地以一定时间间隔触发 timer事件 最先触发的是 load事件 ||| 1 C9 A8 A4 D3 C2 1 应该修改该控件的 interv…

IDEA 安装 Leetcode 插件

1. 下载插件 打开 IDEA ,然后按照如下操作: File -> Settings -> Plugins ,点击然后在右侧搜索栏搜索 leetcode editor 并下载插件或是使用离线的插件进行安装: 官方下载插件的网址:https://plugins.jetbrains…