代码编织梦想

在Java中,文件的压缩与解压缩,主要依赖三个类来完成,ZipInputStream、ZipOutputStream、ZipEntry。

使用java来压缩文件,准备好被压缩的文件。
在这里插入图片描述
Java实现压缩文件,直接上代码

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

public class ZipFile {
    public static void main(String[] args) throws IOException {
        ZipFile zipFile = new ZipFile();
        List<File> fileList = new ArrayList<File>();
        fileList.add(new File("1.txt"));
        fileList.add(new File("2.txt"));
        zipFile.zip(fileList,new File("my.zip"));
    }

    /**
     * 压缩文件
     * @param fileList 待压缩的文件
     * @param destFile 目标压缩包文件
     */
    public void zip(List<File> fileList, File destFile) throws IOException {
        if(fileList==null||fileList.isEmpty()){
            return;
        }
        OutputStream out = new FileOutputStream(destFile);
        ZipOutputStream zipOutputStream = new ZipOutputStream(new BufferedOutputStream(out));
        //设置压缩等级,范围0-9 压缩等级越高,压缩体积越小,压缩时间越长
        zipOutputStream.setLevel(5);
        for (File file : fileList){
            //zip文件条目
            ZipEntry zipEntry = new ZipEntry(file.getName());
            zipOutputStream.putNextEntry(zipEntry);
            FileInputStream fileInputStream = new FileInputStream(file);
            byte[] bytes = new byte[1024];
            int len = 0;
            while((len=fileInputStream.read(bytes))!=-1){
                zipOutputStream.write(bytes,0,len);
            }
            zipOutputStream.closeEntry();
            fileInputStream.close();
        }
        zipOutputStream.close();
    }
}

运行效果,效果如下图
在这里插入图片描述
现在Java来实现解压文件,代码如下

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

public class ZipFile {
    public static void main(String[] args) throws IOException {
        ZipFile zipFile = new ZipFile();
//        List<File> fileList = new ArrayList<File>();
//        fileList.add(new File("1.txt"));
//        fileList.add(new File("2.txt"));
//        zipFile.zip(fileList,new File("my.zip"));
        zipFile.unzip(new File("my.zip"),new File("./test"));
    }

    /**
     * 压缩文件
     * @param fileList 待压缩的文件
     * @param destFile 目标压缩包文件
     */
    public void zip(List<File> fileList, File destFile) throws IOException {
        if(fileList==null||fileList.isEmpty()){
            return;
        }
        OutputStream out = new FileOutputStream(destFile);
        ZipOutputStream zipOutputStream = new ZipOutputStream(new BufferedOutputStream(out));
        //设置压缩等级,范围0-9 压缩等级越高,压缩体积越小,压缩时间越长
        zipOutputStream.setLevel(5);
        for (File file : fileList){
            //zip文件条目
            ZipEntry zipEntry = new ZipEntry(file.getName());
            zipOutputStream.putNextEntry(zipEntry);
            FileInputStream fileInputStream = new FileInputStream(file);
            byte[] bytes = new byte[1024];
            int len = 0;
            while((len=fileInputStream.read(bytes))!=-1){
                zipOutputStream.write(bytes,0,len);
            }
            zipOutputStream.closeEntry();
            fileInputStream.close();
        }
        zipOutputStream.close();
    }
}
/**
     * 解压缩包
     * @param zipFile 源压缩文件
     * @param destFile 压缩目录
     */
    public void unzip(File zipFile,File destFile) throws IOException {
        if(zipFile == null)return;
        if (destFile.isFile())return;
        //destFile目录不存在,创建该目录
        if(!destFile.exists()){
            destFile.mkdirs();
        }
        ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(zipFile));
        ZipEntry zipEntry;
        while ((zipEntry=zipInputStream.getNextEntry())!=null){
            String name = zipEntry.getName();
            File file = new File(destFile,name);
            if(zipEntry.isDirectory()){
                file.mkdirs();
                continue;
            }
            FileOutputStream fileOutputStream = new FileOutputStream(file);
            int len = 0;
            byte[] bytes = new byte[1024];
            while ((len=zipInputStream.read(bytes))!=-1){
                fileOutputStream.write(bytes,0,len);
            }
            zipInputStream.closeEntry();
            fileOutputStream.close();
        }
        zipInputStream.close();

    }

运行效果,如下图
在这里插入图片描述
上面的代码,只能压缩文件,不能压缩文件目录。现在我们进行改进。

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

public class ZipFile {
    public static void main(String[] args) throws IOException {
        ZipFile zipFile = new ZipFile();
        List<File> fileList = new ArrayList<File>();
        fileList.add(new File("1.txt"));
        fileList.add(new File("2.txt"));
        fileList.add(new File("test"));
        zipFile.zip(fileList,new File("myDir.zip"));
//        zipFile.unzip(new File("my.zip"),new File("./test"));
    }

    /**
     * 压缩文件
     * @param fileList 待压缩的文件
     * @param destFile 目标压缩包文件
     */
    public void zip(List<File> fileList, File destFile) throws IOException {
        if(fileList==null||fileList.isEmpty()){
            return;
        }
        OutputStream out = new FileOutputStream(destFile);
        ZipOutputStream zipOutputStream = new ZipOutputStream(new BufferedOutputStream(out));
        //设置压缩等级,范围0-9 压缩等级越高,压缩体积越小,压缩时间越长
        zipOutputStream.setLevel(5);
        for (File file : fileList){
            compress(file,zipOutputStream);
            //zip文件条目
//            ZipEntry zipEntry = new ZipEntry(file.getName());
//            zipOutputStream.putNextEntry(zipEntry);
//            FileInputStream fileInputStream = new FileInputStream(file);
//            byte[] bytes = new byte[1024];
//            int len = 0;
//            while((len=fileInputStream.read(bytes))!=-1){
//                zipOutputStream.write(bytes,0,len);
//            }
//            zipOutputStream.closeEntry();
//            fileInputStream.close();
        }
        zipOutputStream.close();
    }

    private void compress(File file, ZipOutputStream zipOutputStream) throws IOException {
        if (file.isFile()){
            compressFile(file,file.getName(),zipOutputStream);
        }else{
            compressDir(file,file.getName(),zipOutputStream);
        }
    }

    /**
     * 压缩文件夹
     * @param file  文件夹对象
     * @param name  文件夹名称
     * @param zipOutputStream   zip流
     */
    private void compressDir(File file, String name, ZipOutputStream zipOutputStream) throws IOException {
        if(file.isDirectory()){
            File[] files = file.listFiles();
            zipOutputStream.putNextEntry(new ZipEntry(name+"/"));
            zipOutputStream.closeEntry();
            if(files!=null){
                for(File f:files){
                    if(f.isFile()){
                        compressFile(f,name+"/"+f.getName(),zipOutputStream);
                    }else {
                        compressDir(f,name+"/"+f.getName(),zipOutputStream);
                    }
                }
            }
        }
    }

    /**
     * 压缩文件类型
     * @param file 文件对象
     * @param name  文件名称
     * @param zipOutputStream zip流
     */
    private void compressFile(File file, String name, ZipOutputStream zipOutputStream) throws IOException {
        //zip文件条目
        ZipEntry zipEntry = new ZipEntry(name);
        zipOutputStream.putNextEntry(zipEntry);
        FileInputStream fileInputStream = new FileInputStream(file);
        byte[] bytes = new byte[1024];
        int len = 0;
        while((len=fileInputStream.read(bytes))!=-1){
            zipOutputStream.write(bytes,0,len);
        }
        zipOutputStream.closeEntry();
        fileInputStream.close();
    }



    /**
     * 解压缩包
     * @param zipFile 源压缩文件
     * @param destFile 压缩目录
     */
    public void unzip(File zipFile,File destFile) throws IOException {
        if(zipFile == null)return;
        if (destFile.isFile())return;
        //destFile目录不存在,创建该目录
        if(!destFile.exists()){
            destFile.mkdirs();
        }
        ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(zipFile));
        ZipEntry zipEntry;
        while ((zipEntry=zipInputStream.getNextEntry())!=null){
            String name = zipEntry.getName();
            File file = new File(destFile,name);
            if(zipEntry.isDirectory()){
                file.mkdirs();
                continue;
            }
            FileOutputStream fileOutputStream = new FileOutputStream(file);
            int len = 0;
            byte[] bytes = new byte[1024];
            while ((len=zipInputStream.read(bytes))!=-1){
                fileOutputStream.write(bytes,0,len);
            }
            zipInputStream.closeEntry();
            fileOutputStream.close();
        }
        zipInputStream.close();

    }


}

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/WEN38306482/article/details/123432459

文件压缩与解压缩(哈夫曼编码压缩方式)-爱代码爱编程

         本文采用哈夫曼编码的方式进行文件(文本文件)压缩和解压缩,首先介绍项目的整体思路:哈夫曼编码压缩文件实际就是统计出文件中各个字符出现的频率,然后为每个字符生成对应的编码,然后将每个字符用哈夫曼编码的形式按字节保存在压缩文件中。而文件的解压缩实际上就是将压缩文件翻译过来保存到解压缩文件中,需要使用压缩过程中生成的配置文件配合完成。下面将具体

哈夫曼树实现文件压缩与解压缩-爱代码爱编程

       见识了360压缩的神奇后,想要实现自己的文件压缩程序,然后花了近一个星期的时间去完成文件压缩与解压缩,期间有很多坑,花了很长时间去调试它,最后把坑给填了(真心的感受到了程序员写代码时的小小粗心会把自己给坑惨)。以下是些程序时的一些坑: 在windows下回车的字符是‘\r’'\n',编译器在读取字符时读取到'\r'后再读取到'\n'就会

文件压缩与解压缩(哈夫曼编码)_memory逝言的博客-爱代码爱编程

本文采用哈夫曼编码的方式进行文件(文本文件)压缩和解压缩,首先介绍项目的整体思路:哈夫曼编码压缩文件实际就是统计出文件中各个字符出现的频率,然后为每个字符生成对应的编码,然后将每个字符用哈夫曼编码的形式按字节保存在压缩文件中

linux 基础知识 | 文件压缩与解压缩__wangjianfeng的博客-爱代码爱编程

Linux 基础知识 | 文件压缩与解压缩 压缩技术原理 在计算机系统中,文件大小的计算是使用Bytes单位,但是事实上,计算机最小的计量单位是Bits,它们之间的关系为1Bytes = 8bits。假设我们只需要在计算

哈夫曼压缩与解压缩_西邮陈冠希的博客-爱代码爱编程_解压缩算法

哈夫曼压缩与解压缩 目录 哈夫曼压缩与解压缩 一:引言 二:主要技术点 三:过程介绍 1、压缩: 2、解压缩 四:详细分析 一:准备过程 二:压缩 三:解压缩 五:结果演示 六:总结 七:源码地址 一:引言 之前的两个贪吃蛇和巨大数的练习,总体来说难度不大,有好的算法和比较新颖的微译码补码。但是,哈夫曼压缩与解压缩可以说难

linux文件压缩与解压缩_it技术猿猴的博客-爱代码爱编程

常用压缩文件: *.Z compress程序压缩的文件; *.gz gzip程序压缩的文件; *.bz2 bzip2程序压缩的文件; *.tar tar程序打包的文件,文件大小没有改变; *.tar.gz tar程序打包的文

ios文件压缩与解压缩,ziparchive使用-爱代码爱编程

1. 导入三方包 包地址:https://github.com/ZipArchive/ZipArchive 或者通过pod加载 pod 'SSZipArchive’ 2. 使用 路径宏定义,方便使用 #define doc_path(_fileOrFolder_) [[NSSearchPathForDirectoriesInDomains(NSC

java实现zip文件压缩与解压缩--附完整代码_就是二二二二婷的博客-爱代码爱编程_java解压缩zip文件

Java实现文件压缩与解压缩-----zip 1 基本概念 2 zip压缩 2.1 zip压缩代码实现 2.2 zip压缩代码改进 3 zip解压