使用Java IO进行压缩和解压缩 | ZIP和GZIP的实现

news2024/12/30 3:51:03

文章目录

  • 一、概述
  • 二、ZIP
    • 2.1 ZIP格式介绍
    • 2.2 Java IO中的ZIP库和类介绍
    • 2.3 ZIP压缩文件
    • 2.4 ZIP解压缩文件
  • 三、GZIP
    • 3.1 GZIP格式介绍
    • 3.2 Java IO中的GZIP库和类介绍
    • 3.3 GZIP压缩文件
    • 3.4 GZIP解压缩文件
  • 四、压缩和解压缩的注意事项
    • 4.1 选择合适的压缩格式和方法
    • 4.2 处理大文件和大数据集的压缩和解压缩技巧
    • 4.3 错误处理和异常情况的注意事项
  • 总结

一、概述

  Java IO中的压缩和解压缩功能主要通过java.util.zip包和java.util.jar包来实现,并具有以下作用和优势:

  • 方便易用:Java提供了简洁而易于使用的API,使得压缩和解压缩变得简单和方便。
  • 多种压缩算法支持:Java提供了多种压缩算法,如ZIP、GZIP、JAR等,可以根据不同的需求选择合适的算法进行压缩和解压缩。
  • 文件和目录压缩:Java的压缩和解压缩功能可以处理单个文件或整个目录,使得对文件和目录的压缩和解压缩变得灵活和高效。
  • 流式压缩和解压缩:Java提供了流式的压缩和解压缩接口,可以边读取数据边进行压缩或解压缩,节省内存和磁盘空间。
  • 压缩级别控制:Java允许设置压缩级别,从而在压缩效率和压缩比之间进行权衡,满足不同场景的需求。

  本篇文章将介绍ZIP和GZIP格式的压缩和解压缩如何实现。



二、ZIP


2.1 ZIP格式介绍

  ZIP是一种常见的压缩文件格式,它将多个文件和目录打包成一个单独的文件,以减少存储空间和传输带宽。ZIP格式支持密码加密、目录结构、注释等功能,广泛应用于文件压缩、数据备份、软件分发等场景。

  ZIP文件由多个文件和目录组成,其中每个文件都可以进行压缩和解压缩操作。ZIP文件的结构包括文件头、中央目录、局部文件头和文件数据等部分。文件头记录了每个文件的元数据信息,中央目录存储了所有文件的索引和位置信息,局部文件头包含了每个文件的压缩方式和属性信息,文件数据则是经过压缩的文件内容。
在这里插入图片描述

2.2 Java IO中的ZIP库和类介绍

  Java IO库提供了对ZIP压缩和解压缩的支持,主要通过java.util.zip包中的类来实现,可以方便地进行ZIP文件的创建、读取、添加、删除和解压缩操作。

  • ZipOutputStream:用于创建ZIP文件并向其中写入压缩数据的输出流。
  • ZipEntry:表示ZIP文件中的一个条目,可以是文件或目录。
  • ZipFile:用于读取ZIP文件中的条目和数据的类。
  • ZipInputStream:用于从ZIP文件中读取压缩数据的输入流。

  使用Java IO进行ZIP压缩和解压缩非常简单,只需使用相应的输入流和输出流类,并按照指定的方式读取和写入数据即可。

2.3 ZIP压缩文件

  下列代码通过ZipOutputStream类创建了一个ZIP输出流,并指定输出的ZIP文件路径。然后,通过递归调用zipFile方法,将源目录中的文件和目录逐个添加到ZIP文件中。

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.ZipOutputStream;

public class ZipExample {
    public static void main(String[] args) {
        String sourceDir = "path/to/source/directory";
        String zipFile = "path/to/output/zipfile.zip";
        
        try (ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFile))) {
            File fileToZip = new File(sourceDir);
            zipFile(fileToZip, fileToZip.getName(), zipOut);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    private static void zipFile(File fileToZip, String fileName, ZipOutputStream zipOut) throws IOException {
        if (fileToZip.isHidden()) {
            return;
        }
        
        if (fileToZip.isDirectory()) {
            File[] children = fileToZip.listFiles();
            for (File childFile : children) {
                zipFile(childFile, fileName + "/" + childFile.getName(), zipOut);
            }
        } else {
            byte[] buffer = new byte[1024];
            FileInputStream fis = new FileInputStream(fileToZip);
            zipOut.putNextEntry(new ZipEntry(fileName));
            int length;
            while ((length = fis.read(buffer)) >= 0) {
                zipOut.write(buffer, 0, length);
            }
            fis.close();
        }
    }
}

2.4 ZIP解压缩文件

  下列代码通过ZipInputStream类创建了一个ZIP输入流,并指定输入的ZIP文件路径。然后,通过循环读取ZIP输入流中的条目,并根据条目的类型进行相应的处理,实现了对ZIP文件的解压缩操作。

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

public class UnzipExample {
    public static void main(String[] args) {
        String zipFile = "path/to/zipfile.zip";
        String outputDir = "path/to/output/directory";
        
        try (ZipInputStream zipIn = new ZipInputStream(new FileInputStream(zipFile))) {
            ZipEntry entry = zipIn.getNextEntry();
            while (entry != null) {
                String filePath = outputDir + File.separator + entry.getName();
                if (!entry.isDirectory()) {
                    extractFile(zipIn, filePath);
                } else {
                    File dir = new File(filePath);
                    dir.mkdirs();
                }
                zipIn.closeEntry();
                entry = zipIn.getNextEntry();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    private static void extractFile(ZipInputStream zipIn, String filePath) throws IOException {
        byte[] buffer = new byte[1024];
        FileOutputStream fos = new FileOutputStream(filePath);
        int length;
        while ((length = zipIn.read(buffer)) >= 0) {
            fos.write(buffer, 0, length);
        }
        fos.close();
    }
}



三、GZIP


3.1 GZIP格式介绍

  GZIP 是一种常用的数据压缩算法,广泛应用于前端开发中以减小文件的大小,提高网页加载速度和网络传输效率。

  在前端应用中,GZIP 主要用于压缩静态资源文件,如 HTML、CSS、JavaScript、图像等。通过使用 GZIP 压缩这些文件,可以减小它们的文件大小,从而减少网络传输的数据量,加快文件的下载速度。

  nginx开启GZIP压缩:https://blog.csdn.net/CharmaineXia/article/details/129242601
  GZIP应用实践:高并发环境如何有效缓解带宽压力

3.2 Java IO中的GZIP库和类介绍

Java IO库提供了对GZIP压缩和解压缩的支持,主要通过java.util.zip包中的类来实现。下面是一些常用的GZIP相关类的介绍:

  • GZIPOutputStream:用于创建GZIP文件并向其中写入压缩数据的输出流。
  • GZIPInputStream:用于从GZIP文件中读取压缩数据的输入流。

这些类提供了简单而易于使用的API,可以方便地进行GZIP文件的创建、读取、压缩和解压缩操作。

3.3 GZIP压缩文件

  通过GZIPOutputStream类创建了一个GZIP输出流,并指定输出的GZIP文件路径。然后,通过读取源文件的内容,并将其写入GZIP输出流中,实现了对文件的压缩操作。

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.GZIPOutputStream;

public class GzipExample {
    public static void main(String[] args) {
        String sourceFile = "path/to/source/file.txt";
        String gzipFile = "path/to/output/file.txt.gz";
        
        try (FileInputStream fis = new FileInputStream(sourceFile);
             GZIPOutputStream gzipOut = new GZIPOutputStream(new FileOutputStream(gzipFile))) {
            byte[] buffer = new byte[1024];
            int length;
            while ((length = fis.read(buffer)) >= 0) {
                gzipOut.write(buffer, 0, length);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3.4 GZIP解压缩文件

  通过GZIPInputStream类创建了一个GZIP输入流,并指定输入的GZIP文件路径。然后,通过读取GZIP输入流中的压缩数据,并将其写入目标文件中,实现了对文件的解压缩操作。

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.GZIPInputStream;

public class GunzipExample {
    public static void main(String[] args) {
        String gzipFile = "path/to/gzip/file.txt.gz";
        String outputFile = "path/to/output/file.txt";
        
        try (GZIPInputStream gzipIn = new GZIPInputStream(new FileInputStream(gzipFile));
             FileOutputStream fos = new FileOutputStream(outputFile)) {
            byte[] buffer = new byte[1024];
            int length;
            while ((length = gzipIn.read(buffer)) >= 0) {
                fos.write(buffer, 0, length);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}



四、压缩和解压缩的注意事项


4.1 选择合适的压缩格式和方法

  在进行压缩和解压缩操作时,选择合适的压缩格式和方法非常重要,可以根据不同的需求和场景进行选择。以下是一些常见的压缩格式和方法以及适用的情况:

  • ZIP格式:ZIP是一种通用的压缩格式,广泛应用于文件压缩、数据备份和软件分发等场景。它支持密码加密、目录结构、注释等功能,适用于压缩多个文件和目录。

  • GZIP格式:GZIP是一种流式压缩格式,适用于压缩单个文件或流数据。它通常用于网络传输和日志文件压缩,具有较高的压缩比和较快的压缩速度。

  • BZIP2格式:BZIP2是一种高压缩比的压缩格式,适用于压缩大型文件和数据集。它的压缩速度相对较慢,但可以获得更高的压缩比。

  • LZ4格式:LZ4是一种快速压缩格式,适用于需要快速压缩和解压缩的场景。它具有较低的压缩比,但具有非常快的压缩和解压缩速度。

4.2 处理大文件和大数据集的压缩和解压缩技巧

  处理大文件和大数据集的压缩和解压缩需要考虑内存消耗和性能问题。以下是一些处理大文件和大数据集的压缩和解压缩技巧:

  • 分块压缩和解压缩:将大文件或大数据集分成多个块,分别进行压缩和解压缩操作。这样可以减少内存消耗,并且可以同时处理多个块,提高处理速度。

  • 流式压缩和解压缩:使用流式压缩和解压缩算法,逐个处理输入数据的部分,而不是一次性加载整个文件或数据集。这样可以降低内存消耗,并且可以在处理数据的同时进行压缩或解压缩操作。

  • 并行压缩和解压缩:利用多线程或分布式计算的能力,并行处理多个文件或数据块的压缩和解压缩操作。这样可以充分利用计算资源,提高处理速度。

  • 选择合适的压缩算法和参数:根据实际情况选择合适的压缩算法和参数,权衡压缩比和压缩速度。有些算法在处理大文件或大数据集时可能更适合,例如LZ4算法具有较快的压缩和解压缩速度。

4.3 错误处理和异常情况的注意事项

  在进行压缩和解压缩操作时,需要注意错误处理和异常情况,以确保程序的稳定性和可靠性。以下是一些处理错误和异常情况的注意事项:

  • 捕获和处理异常:在进行压缩和解压缩操作时,使用try-catch语句捕获可能抛出的异常,并进行适当的处理。例如,处理文件读写异常、压缩算法异常等。

  • 关闭资源:在压缩和解压缩完成后,及时关闭相关的输入流和输出流,释放系统资源。使用try-with-resources语句可以确保资源的正确关闭。

  • 错误处理策略:针对不同的错误情况,可以采取不同的错误处理策略。例如,可以记录错误日志、回滚操作、重新尝试操作等。

  • 异常信息提示:在处理异常时,可以提供有用的异常信息和错误提示,以便于排查和调试问题。可以使用日志记录框架或自定义异常类来提供详细的异常信息。


总结


  在选择压缩格式和方法时,我们应根据实际需求和场景进行选择,考虑压缩比、压缩速度、解压缩速度和平台兼容性等因素,根据实际需求和场景选择合适的压缩格式和方法,并采用相应的技巧和注意事项来处理大文件和大数据集,以及处理错误和异常情况。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/796924.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

山西电力市场日前价格预测【2023-07-28】

日前价格预测 预测明日(2023-07-28)山西电力市场全天平均日前电价为349.59元/MWh。其中,最高日前电价为378.84元/MWh,预计出现在20: 15。最低日前电价为321.82元/MWh,预计出现在13: 15。 价差方向预测 1:实…

【Ajax】笔记-jsonp实现原理

JSONP JSONP是什么 JSONP(JSON With Padding),是一个非官方的跨域解决方案,纯粹凭借程序员的聪明才智开发出来的,只支持get请求。JSONP 怎么工作的? 在网页有一些标签天生具有跨域能力,比如:img link iframe script. …

为什么说RL 是强化学习的技巧?

一、说明 深度学习(DL)很难训练,强化学习(RL)要更难。在早期开发中,遵循与 DL 相同的策略:保持简单!消除任何妨碍您的花里胡哨的东西,并将不确定性降至最低。 具体到RL&a…

利用spss进行因子筛选相关性分析

因变量放在前面,其他的变量全部导入即可 点击确定得到结果 两个星**表示相关性显著,*一颗星次之,一般我们选择两个星的变量,进行后续的建模

新能源电动汽车交流充电桩控制主板的配置

新能源电动汽车充电桩控制主板的配置 你是否曾经遇到过充电桩无法兼容你的电动车,或者充电速度慢如蜗牛?原来是充电桩主板的配置问题! 充电桩主板是充电桩控制系统的核心,它的配置决定了充电桩的性能和兼容性。 首先,处理器是充电桩主板的核…

Selenium+Java环境搭建(测试系列6)

目录 前言: 1.浏览器 1.1下载Chrome浏览器 1.2查看Chrome浏览器版本 1.3下载Chrome浏览器的驱动 2.配置系统环境变量path 3.验证是否成功 4.出现的问题 结束语: 前言: 这节中小编给大家讲解一下有关于Selenium Java环境的搭建&…

关于position:fixed定位的位置不对的问题(即没有按照浏览器的窗口进行定位)

问题: 今天在开发过程中发现元素使用 position: fixed 时位置有问题,位置跟我写的位置对不上,后面在 MDN 上面找到了答案,下面是关于 position: fixed 的描述: fixed: 元素会被移出正常文档流,并…

多组输入字符,每一次都判断这个字符是否为字母

首先多组输入,就要用到循环 然后是输入字符,用函数getchar() 又因为getchar()输入的字符后面有还有一个‘\0’,所以代码的最后还应该单独写一个getchar()函数来把\0处理了 代码: int main() {int ch 0;wh…

图表的使用

<template><!-- 外层 --><div><!-- 上面 --><header><!-- 上面item --><div class"fl"><div class"leftimg"><img src"../../assets/orders.png" width"50px" alt /></div&…

【建议收藏】Kubernetes 网络策略入门:概念、示例和最佳实践,附云原生资料

目录 摘要 一、Kubernetes 网络策略组件 二、实施网络策略 示例 1&#xff1a;在命名空间中限制流量 示例 2&#xff1a;允许特定 Pod 的流量 示例 3&#xff1a;在单个策略中组合入站和出站规则 示例 4&#xff1a;阻止对特定 IP 范围的出站流量 三、Kubernetes 网络策…

Lua脚本解决多条命令原子性问题

Redis是一个流行的键值存储数据库&#xff0c;它提供了丰富的功能和命令。在Redis中&#xff0c;我们可以使用Lua脚本来编写多条命令&#xff0c;以确保这些命令的原子性执行。Lua是一种简单易学的编程语言&#xff0c;下面将介绍如何使用Redis提供的调用函数来操作Redis并保证…

redis中使用bloomfilter判断元素是否存在

一 bloomfiler的作用 1.1 bloomfilter的作用 由一个初始值为0的bit数组组成&#xff0c;和多个hash函数构成&#xff0c;用来判断集合中是否存在某个元素。 一个很长的二进制数组&#xff08;00000000&#xff09;一系列随机hash算法映射函数。主要用于判断一个元素是否存在…

【产品应用】一体化伺服电机在激光雷达设备中的应用

激光雷达作为一种重要的感知技术&#xff0c;被广泛应用于气象探测、追踪、机器人导航、风力资源等领域。而在激光雷达设备中&#xff0c;一体化伺服电机的应用正发挥着重要的作用。本文将介绍一体化伺服电机在激光雷达设备应用中的优势&#xff0c;展示其对激光雷达技术发展的…

四.在 Linux 上以 All-in-One 模式安装 KubeSphere

1.初始操作 # 关闭防火墙 systemctl stop firewalld systemctl disable firewalld# 关闭selinux sed -i s/enforcing/disabled/ /etc/selinux/config # 永久 setenforce 0 # 临时# 关闭swap swapoff -a # 临时 sed -ri s/.*swap.*/#&/ /etc/fstab # 永久# 将桥接的I…

2023河南萌新联赛第(三)场:郑州大学 F

把题中所给的式子进行展开&#xff0c;最终可以得到一个等比数列。运用等比数列求和公式即可。 相关知识点&#xff1a;欧拉降幂&#xff0c;逆元。 逆元的用处&#xff1a;因为求和公式需要去除分子&#xff0c;而大数除法去取模会丢失精度&#xff0c;所以可以采用求出分子…

深度学习入门教程(1):用神经网络预测糖尿病病例Predict Diabetes Cases with Neural Networks

本深度学习入门教程是在polyu HPCStudio 启发以及资源支持下进行的&#xff0c;在此也感谢polyu以及提供支持的老师。 大纲&#xff08;what will you learn from this project&#xff09; 1&#xff1a;What are neural networks&#xff1f; 2&#xff1a;Why use neural …

Ubuntu /dev/loop<0..n>挂载的目录的分析

执行命令df -h lkmaoubuntu:~$ df -h Filesystem Size Used Avail Use% Mounted on udev 1.6G 0 1.6G 0% /dev tmpfs 391M 2.1M 389M 1% /run /dev/sda1 59G 30G 26G 54% / tmpfs 2.0G 0 2.0G 0% /dev/s…

华硕PN62:BIOS来电重启 和win10关闭升级Windows11提示方法

1&#xff0c;开机长按del键进bios设置界面&#xff0c;点高级—电源管理或APM Restore AC Power Loss有两个都选power on。如果不成功&#xff0c;检查主板上纽扣电池是否有电。 restore on ac power loss意思是“交流失电恢复”&#xff0c;这是BIOS里的电源管理选项&#xf…

【Python机器学习】实验04(1) 多分类(基于逻辑回归)实践

文章目录 多分类以及机器学习实践如何对多个类别进行分类1.1 数据的预处理1.2 训练数据的准备1.3 定义假设函数&#xff0c;代价函数&#xff0c;梯度下降算法&#xff08;从实验3复制过来&#xff09;1.4 调用梯度下降算法来学习三个分类模型的参数1.5 利用模型进行预测1.6 评…

volatile关键字(轻量级锁)

目录 一、volatile出现背景 二、JMM概述 2.1、JMM的规定 三、volatile的特性 3.1、可见性 3.1.1、举例说明 3.1.2、总结 3.2、无法保证原子性 3.2.1、举例说明 3.2.2、分析 3.2.3、使用volatile对原子性测试 3.2.4、使用锁机制 3.2.5、总结 3.3、禁止指令重排序 四、v…