简单又高效!JavaSE实现文件压缩与解压缩之技巧

咦咦咦,各位小可爱,我是你们的好伙伴------bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~


🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!

js 复制代码
环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8

前言

我们在日常实际开发中,对于文件压缩和解压缩场景,是非常常见的操作,它可以减少存储空间占用和网络传输时间。在JavaSE中,就提供了一套文件压缩和解压缩的API,可以方便地实现这一功能,而今天,我就来深入聊聊它。

本文将从源代码解析、应用场景案例、优缺点分析、案例演示等方面详细介绍JavaSE中文件压缩和解压缩的相关知识,希望能够帮助到有需要的小伙伴们。

摘要

本文详细介绍JavaSE中文件压缩和解压缩的实现方法,包括源代码解析、应用场景案例、优缺点分析、案例演示、文末总结等等,请同学们耐心阅读。

正文

简介

首先,什么是文件压缩?其实隐约可以明白,文件压缩是将一个或多个文件通过某种算法进行处理,使得文件的大小得到压缩,大白话说就是用于将文件或数据压缩为更小尺寸以节省存储空间或传输时间的格式,比如日常见到的xxx.zip | xxx.RAR。解压缩则是将压缩过的文件还原成原始的文件。

拓展:以下是一些常见的压缩格式:

  1. ZIP:最常见的压缩格式之一,广泛用于打包和压缩文件和文件夹。

  2. RAR:另一种流行的压缩格式,通常用于创建较小且更高效的压缩文件。

  3. 7z:提供更高的压缩比率和更强大的加密功能的开源压缩格式。

  4. GZIP:用于在UNIX和Linux系统上进行文件压缩,通常与.tar结合使用形成.tar.gz文件。

  5. TAR:用于将多个文件打包成一个文件,通常与其他压缩算法(如gzip)结合使用。

  6. BZIP2:提供更高的压缩率但速度较慢的压缩算法。

  7. LZMA:具有高压缩比率和解压缩速度的算法,通常使用在7z压缩格式中。

  8. XZ:基于LZMA算法的开源数据压缩格式,提供比GZIP更高的压缩比。

这些是常见的压缩格式,每种格式都有其自身的优点和适用场景。根据需要选择合适的压缩格式来管理文件和数据。

基于代码中,在JavaSE中我们可以直接使用java.util.zip包中的类来进行文件的压缩和解压缩操作。这个包提供了对zip格式的支持,可以方便地实现文件的压缩和解压缩。至于其他格式的解压是否满足,那就发挥大家的创造力与探索力啦,这里我就不一一给大家进行演示啦。

源代码解析

如下,我给大家写了个简单的示例代码,演示了如何使用JavaSE中的API进行文件的压缩和解压缩操作。代码演示如下:

java 复制代码
package com.demo.javase.day79;

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;

/**
 * @Author bug菌
 * @Date 2023-12-27 18:03
 */
public class FileCompression {

    // 压缩文件
    public static void compressFile(File sourceFile, File compressedFile) throws IOException {
        FileInputStream fis = new FileInputStream(sourceFile);
        FileOutputStream fos = new FileOutputStream(compressedFile);
        ZipOutputStream zos = new ZipOutputStream(fos);
        ZipEntry ze = new ZipEntry(sourceFile.getName());
        zos.putNextEntry(ze);
        byte[] buffer = new byte[1024];
        int len;
        while ((len = fis.read(buffer)) > 0) {
            zos.write(buffer, 0, len);
        }
        zos.closeEntry();
        zos.close();
        fos.close();
        fis.close();
    }
    
    
    // 解压缩文件
    public static void decompressFile(File compressedFile, File destinationFile) throws IOException {
        FileInputStream fis = new FileInputStream(compressedFile);
        ZipInputStream zis = new ZipInputStream(fis);
        FileOutputStream fos = new FileOutputStream(destinationFile);
        ZipEntry ze = zis.getNextEntry();
        byte[] buffer = new byte[1024];
        int len;
        while ((len = zis.read(buffer)) > 0) {
            fos.write(buffer, 0, len);
        }
        zis.closeEntry();
        zis.close();
        fos.close();
        fis.close();
    }
}

针对compressFile方法是用于将指定的源文件进行压缩,并输出到目标文件中;decompressFile方法则是将压缩文件解压缩,并输出到目标文件中。其中,ZipOutputStreamZipInputStream类分别用于压缩和解压缩操作。

代码分析:

这里,我给大家做个讲解,针对如上代码,我定义了一个文件压缩和解压缩的工具类。其中该类提供了两个静态方法:compressFile()用于将源文件压缩成一个压缩文件,decompressFile()用于解压缩一个压缩文件到目标文件,具体我如何使用我会在接下里的案例中进行模拟演示的。

1. 在compressFile()方法中,该方法接受两个参数:源文件(sourceFile)和压缩文件(compressedFile);它首先创建一个文件输入流(FileInputStream)来读取源文件,创建一个文件输出流(FileOutputStream)来写入压缩文件;然后,创建一个压缩输出流(ZipOutputStream)来将数据写入到压缩文件中;接着,创建一个压缩实体(ZipEntry),并设置压缩实体的名称为源文件的名称;然后,将创建的压缩实体添加到压缩输出流中,之后使用一个字节数组缓冲区(byte[])来读取源文件的数据,并将数据写入到压缩输出流中,直到达到文件的末尾;最后,关闭压缩实体、压缩输出流、文件输出流和文件输入流,这样,该方法就完成了。

2. 在decompressFile()方法中,该方法接受两个参数:压缩文件(compressedFile)和目标文件(destinationFile);它首先创建一个文件输入流(FileInputStream)来读取压缩文件,创建一个压缩输入流(ZipInputStream)来读取压缩文件中的数据;然后,创建一个文件输出流(FileOutputStream)来将解压缩的数据写入到目标文件中;接着,使用压缩输入流(ZipInputStream)获取压缩文件中的下一个条目(ZipEntry)。之后,使用一个字节数组缓冲区(byte\[])来读取压缩输入流中的数据,并将数据写入到文件输出流中,直到达到压缩文件的末尾;最后,关闭压缩输入流、文件输出流和文件输入流,该方法就完成了。

总的来说,该类使用了Java所提供的压缩/解压缩库(java.util.zip)中的类和方法来实现文件的压缩和解压缩操作,不知道我这么解读,可否能够明白且理解呢?

实际代码截图:

应用场景案例

这里,给大家介绍下,文件压缩和解压缩的使用场景,其实呢,在各种场景中都有它的广泛应用,下面是一些常见的应用场景案例,比如:

  1. 压缩和解压缩文件上传下载:可以减少网络传输时间和存储空间占用,提高传输效率。
  2. 压缩和解压缩备份文件:可以节省存储空间,方便文件的备份和恢复。
  3. 压缩和解压缩日志文件:可以减少存储空间占用,方便日志文件的管理和分析。
  4. 压缩和解压缩静态资源文件:可以减少网络传输时间,提高网页的加载速度。

以上几个场景都是我日常项目中所使用到的,基本各个项目中都有这些小功能点的嵌入。

优缺点分析

然后,是不是这个功能点就非常的优越无一弊端呢?此言差矣,凡事都有利有弊,针对文件压缩和解压缩的优点主要有:

  • 减少存储空间占用:通过压缩文件,可以大大减少文件的大小,节省存储空间。
  • 提高传输效率:压缩文件的大小较小,可以减少网络传输时间,提高传输效率。
  • 方便文件的管理:通过压缩和解压缩操作,可以方便地进行文件的备份、恢复和管理。

然后,文件压缩和解压缩也存在一些缺点,比如:

  • 压缩和解压缩操作需要消耗一定的CPU资源,可能会对系统性能产生一定影响。
  • 压缩和解压缩操作可能会导致文件的损坏或丢失,需要谨慎操作。

所以说呐,针对功能点需求是否需要考虑开发的同时,可以去审视下其弊端性。

类代码方法介绍

接着,我给大家介绍下FileCompression类中的一些方法,以便于大家更好的使用它。

java 复制代码
public class FileCompression {
    // 对文件进行压缩
    public void compressFile(String inputFilePath, String outputFilePath) {
        // 实现文件压缩的代码
    }

    // 对文件进行解压缩
    public void decompressFile(String inputFilePath, String outputFilePath) {
        // 实现文件解压缩的代码
    }

    // 压缩文件夹
    public void compressFolder(String inputFolderPath, String outputFilePath) {
        // 实现文件夹压缩的代码
    }

    // 解压缩文件夹
    public void decompressFolder(String inputFilePath, String outputFolderPath) {
        // 实现文件夹解压缩的代码
    }
}
  • 其中compressFile(File sourceFile, File compressedFile)方法是将指定的源文件进行压缩,并输出到目标文件中。
  • 其中decompressFile(File compressedFile, File destinationFile)方法是将压缩文件解压缩,并输出到目标文件中。

通过以上的纯理论学习,接下来,我就带着大家将如上知识点融会贯通,以案例的形式进行演示。

测试用例

下面是针对FileCompression类的测试用例,以main函数的写法作为参考:

java 复制代码
package com.demo.javase.day79;

import java.io.File;
import java.io.IOException;

/**
 * @Author bug菌
 * @Date 2023-12-27 18:04
 */
public class FileCompressionTest {

    public static void main(String[] args) {
        File sourceFile = new File("./person.txt");
        File compressedFile = new File("./compressed.zip");
        File destinationFile = new File("./destination.txt");
        try {
            FileCompression.compressFile(sourceFile, compressedFile);
            FileCompression.decompressFile(compressedFile, destinationFile);
            System.out.println("文件压缩和解压缩成功");
        } catch (IOException e) {
            System.out.println("文件压缩和解压缩失败");
            e.printStackTrace();
        }
    }
}

在测试用例中,我们先创建一个源文件person.txt,然后调用compressFile方法将源文件压缩为compressed.zip文件,再调用decompressFile方法将压缩文件解压缩为destination.txt文件(其中你也可以改成你想指定的文件名)。最后,输出压缩和解压缩是否成功的提示信息。

测试结果

根据如上的测试用例,作者在本地进行测试结果如下,仅供参考,你们也可以自行修改测试用例或者添加其他的测试数据或测试方法,以便于进行熟练学习以此加深知识点的理解。

测试代码分析

根据如上测试用例,在此我给大家进行深入详细的解读一下测试代码,以便于更多的同学能够理解并加深印象。

根据给出的代码,可以分析出以下几点:

  1. 该代码包含一个名为 FileCompressionTest 的公共类,并包含一个名为 main 的静态方法。这个类用于测试文件压缩和解压缩的功能,这里基本大家都能懂。

  2. 然后我在在 main 方法中,创建了一个 sourceFile 对象,该对象表示要压缩的源文件,文件名为 "source.txt"。然后创建了一个 compressedFile 对象,表示压缩后的文件,文件名为 "compressed.zip"。最后创建了一个 destinationFile 对象,表示解压缩后的目标文件,文件名为 "destination.txt"。

  3. try 块中,通过调用 FileCompression 类中的静态方法 compressFilesourceFile 进行压缩,并将压缩后的结果保存到 compressedFile 中。

  4. 接下来,调用 FileCompression 类中的静态方法 decompressFilecompressedFile 进行解压缩,并将解压缩后的结果保存到 destinationFile 中。

  5. 如果以上的压缩和解压缩操作都成功执行,会打印出 "文件压缩和解压缩成功"。如果出现异常,会捕获 IOException 异常,并打印出 "文件压缩和解压缩失败",同时打印出异常的堆栈跟踪信息。

总的来说,如上案例,用于演示文件压缩和解压缩的功能。说白了就是,一先将一个源文件进行压缩,二再将压缩后的文件进行解压缩,最后输出结果,告知有没有压缩成功,解压成功。文章写到这里,基本就接近尾声了,如果屏幕前的你有啥疑问,大胆的通过评论区与作者取得联系,我将不遗余力的给你最快最自己的解惑。

全文小结

本文详细介绍了JavaSE中文件压缩和解压缩的实现方法。通过对源代码的解析,我们了解了如何使用java.util.zip包中的类进行文件的压缩和解压缩操作。同时,我们还介绍了文件压缩和解压缩的应用场景案例,以及优缺点分析。

文件压缩和解压缩是一项实用的技术,在各种场景中都有广泛的应用。通过使用JavaSE中提供的API,我们可以方便地实现文件的压缩和解压缩,提高存储空间利用率和传输效率。

总结

通过本文的学习,我们了解了JavaSE中文件压缩和解压缩的知识。我们掌握了源代码的解析,了解了java.util.zip包中的类的使用方法。我们还了解了文件压缩和解压缩的应用场景和优缺点,以及如何编写测试用例进行验证。

JavaSE中的文件压缩和解压缩功能在实际开发中非常实用,可以提高存储空间利用率和传输效率。希望本文对您有所帮助!

...

好啦,这期的内容就基本接近尾声啦,若你想学习更多,可以参考这篇专栏总结《「滚雪球学Java」教程导航帖》,本专栏致力打造最硬核 Java 零基础系列学习内容,🚀打造全网精品硬核专栏,带你直线超车;欢迎大家订阅持续学习。

附录源码

如上涉及所有源码均已上传同步在「Gitee」,提供给同学们一对一参考学习,辅助你更迅速的掌握。

☀️建议/推荐你


无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学Java」,bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门Java编程,就像滚雪球一样,越滚越大,指数级提升。

最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。
  同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。

📣关于我

我是bug菌,CSDN | 掘金 | infoQ | 51CTO 等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,华为云 | 阿里云| 腾讯云等社区优质创作者,全网粉丝合计15w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料。


本文为稀土掘金技术社区首发签约文章,30天内禁止转载,30天后未获授权禁止转载,侵权必究!

相关推荐
向前看-3 小时前
验证码机制
前端·后端
xlsw_3 小时前
java全栈day20--Web后端实战(Mybatis基础2)
java·开发语言·mybatis
神仙别闹3 小时前
基于java的改良版超级玛丽小游戏
java
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭4 小时前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
暮湫4 小时前
泛型(2)
java
超爱吃士力架4 小时前
邀请逻辑
java·linux·后端
南宫生4 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
转码的小石4 小时前
12/21java基础
java
李小白665 小时前
Spring MVC(上)
java·spring·mvc
GoodStudyAndDayDayUp5 小时前
IDEA能够从mapper跳转到xml的插件
xml·java·intellij-idea