首页 > 编程语言 >Java实现压缩文件浅谈

Java实现压缩文件浅谈

时间:2023-11-19 22:34:40浏览次数:37  
标签:文件 Java 浅谈 ZIP ZipOutputStream 写入 压缩文件 zos File

背景:

在Java中,可以使用java.util.zip包提供的类来进行文件的压缩和解压缩操作。主要涉及的类有ZipOutputStreamZipEntryZipInputStreamInflaterInputStream

压缩文件的步骤和原理:

  1. 创建一个FileOutputStream对象,用于将压缩后的数据写入到文件中。

  2. 创建一个BufferedOutputStream对象,将其包装在FileOutputStream中,以提高写入性能。

  3. 创建一个ZipOutputStream对象,将其包装在BufferedOutputStream中,用于将数据压缩为ZIP格式。

  4. 遍历要压缩的文件列表,对于每个文件执行以下操作:

    • 创建一个ZipEntry对象,表示要添加到ZIP文件中的文件或目录。
    • 使用ZipOutputStreamputNextEntry()方法将ZipEntry添加到ZIP输出流中。
    • 如果当前要添加的条目是目录,可以跳过文件内容的读取和写入步骤。
    • 如果当前要添加的条目是文件,可以执行以下操作:
      • 打开要添加的文件。
      • 创建一个缓冲区字节数组,用于读取文件内容。
      • 使用FileInputStream读取文件内容到缓冲区中。
      • 使用ZipOutputStreamwrite()方法将缓冲区中的数据写入ZIP输出流。
    • 使用ZipOutputStreamcloseEntry()方法关闭当前ZIP条目的写入。

         5. 在完成所有文件的压缩后,关闭ZipOutputStream,以确保所有数据都被写入到ZIP文件中。

示例代码

import java.io.*;
import java.util.zip.*;

public class FileCompressor {
    public static void compressFile(String sourceFilePath, String zipFilePath) throws IOException {
        // 创建源文件的File对象
        File sourceFile = new File(sourceFilePath);
        
        // 创建用于写入压缩数据的输出流
        try (
            FileOutputStream fos = new FileOutputStream(zipFilePath);  // 用于写入ZIP文件的FileOutputStream
            BufferedOutputStream bos = new BufferedOutputStream(fos);  // 用于提高写入效率的BufferedOutputStream
            ZipOutputStream zos = new ZipOutputStream(bos)  // 用于压缩数据的ZipOutputStream
        ) {
            // 递归地压缩源文件
            compressRecursive(sourceFile, sourceFile.getName(), zos);
        }
    }

    private static void compressRecursive(File file, String parentPath, ZipOutputStream zos) throws IOException {
        if (file.isDirectory()) {
            // 如果文件是目录,则创建相应的目录条目并关闭条目
            String entryPath = parentPath + File.separator + file.getName();
            ZipEntry entry = new ZipEntry(entryPath + File.separator);
            zos.putNextEntry(entry);
            zos.closeEntry();

            // 获取目录中的子文件和子目录
            File[] children = file.listFiles();
            if (children != null) {
                for (File child : children) {
                    // 递归地压缩子文件和子目录
                    compressRecursive(child, entryPath, zos);
                }
            }
        } else {
            // 如果文件是普通文件,则创建相应的文件条目并写入文件数据
            try (
                FileInputStream fis = new FileInputStream(file);  // 用于读取文件数据的FileInputStream
                BufferedInputStream bis = new BufferedInputStream(fis)  // 用于提高读取效率的BufferedInputStream
            ) {
                // 创建文件条目并将其加入到压缩流中
                String entryPath = parentPath + File.separator + file.getName();
                ZipEntry entry = new ZipEntry(entryPath);
                zos.putNextEntry(entry);

                // 使用缓冲区读取文件数据并写入压缩流中
                byte[] buffer = new byte[1024];
                int bytesRead;
                while ((bytesRead = bis.read(buffer)) != -1) {
                    zos.write(buffer, 0, bytesRead);
                }

                // 关闭文件条目
                zos.closeEntry();
            }
        }
    }
} 

 

主要涉及类及其作用:

  1. ZipOutputStream:这个类是用于创建ZIP文件并将数据压缩为ZIP格式的主要类。它实现了OutputStream接口,可以向输出流写入ZIP格式的数据。

  2. ZipEntry:这个类表示ZIP文件中的一个条目,可以是文件或目录。它包含了条目的名称、大小、压缩比等信息,并可以作为一个完整的数据单元添加到ZipOutputStream中。

  3. ZipInputStream:这个类是用于从ZIP文件中读取数据并进行解压缩的主要类。它实现了InputStream接口,可以从输入流中读取ZIP格式的数据。

  4. InflaterInputStream:这个类是ZipInputStream的子类,用于解压缩被压缩的数据。它通过使用Inflater对象将压缩数据解压缩为原始数据。

  5. FileInputStream:这个类是用于从文件中读取数据的类。它实现了InputStream接口,可以从输入流中读取文件数据。

  6. FileOutputStream:这个类是用于将数据写入文件的类。它实现了OutputStream接口,可以将数据写入输出流中。

  7. BufferedInputStreamBufferedOutputStream:这两个类是用于提高输入输出性能的类。它们分别将一个输入流和输出流包装在内部,并提供了缓冲区,可以减少对底层流的直接读写操作,从而提高读写效率。

  8. File:这个类是用于表示文件或目录的类。它提供了方法来操作文件的属性、路径、名称等信息。

标签:文件,Java,浅谈,ZIP,ZipOutputStream,写入,压缩文件,zos,File
From: https://www.cnblogs.com/beyond-tester/p/17842850.html

相关文章

  • java 权限修饰符和代码块
    ......
  • java-blog2
    一、前言1、知识点:主要是java中类与类之间的关系和类图的构建以及对数据的处理2、题量:题量不大,简单的作业题量多点,难点的作业题量少点总体来说还行3、难度:难度在不断的变大,每一题所花的时间也在不断的增加二、设计与分析:第四次大作业:设计点菜计价程序,根据输入的信息,计算并输......
  • java 包和final
    packagenet.elaina;publicclassTest{publicstaticvoidmain(String[]args){/*final修饰方法:表明该方法是最终方法,不能被重写final修饰类:表明该类是最终类,不能被继承final修饰变量:叫做常量,只能被赋值......
  • Java 多线程事务控制
    Java多线程怎么做事务控制公司业务中遇到一个需求,需要同时修改最多约5万条数据,而且还不支持批量或异步修改操作。于是只能写个for循环操作,但操作耗时太长,只能一步一步寻找其他解决方案。具体操作如下:一、循环操作的代码先写一个最简单的for循环代码,看看耗时情况怎么样。/......
  • INFINI Labs 产品更新 | 发布 Easysearch Java 客户端,Console 支持 SQL 查询等功能
    近年来,日志管理平台越来越流行。使用日志管理平台可以实时地、统一地、方便地管理和查看日志,挖掘日志数据价值,驱动运维、运营,提升服务管理效率。方案架构Beats是轻量级采集器,包括Filebeat、Metricbeat等。Easysearch是个分布式搜索引擎,提供搜集、分析、存储数据等主要功能。Con......
  • Java学习—计数排序
    计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。1.计数排序的特征当输入的元素是n个0到k之间的整数时,它的运行时间是Θ(n+k)。计数排序不是比较排序,排序的速度快于任......
  • INFINI Labs 产品更新 | 发布 Easysearch Java 客户端,Console 支持 SQL 查询等功能
    近年来,日志管理平台越来越流行。使用日志管理平台可以实时地、统一地、方便地管理和查看日志,挖掘日志数据价值,驱动运维、运营,提升服务管理效率。方案架构Beats是轻量级采集器,包括Filebeat、Metricbeat等。Easysearch是个分布式搜索引擎,提供搜集、分析、存储数据等主要功......
  • 南昌航空大学JAVA Blog-2题目4-6期中考试
    一.前言 在进行题目集4-6的练习时,老师课堂上讲的内容一般都会围绕在这次题目集需要用到的新内容上。对于题目集代码的完成有很大的帮助,如课堂讲的封装、继承、多态等内容,简化了代码修改的难度,正则表达式则在一定程度上减少了代码量。但是就我个人认为,这几次的题目集除了期中考试......
  • java反序列化----CC6利用链学习笔记(HashMap和HashSet)
    目录java反序列化----CC6利用链学习笔记环境配置利用链java反序列化----CC6利用链学习笔记环境配置jdk8(无版本要求)pom.xml中写入<dependency><groupId>commons-collections</groupId><artifactId>commons-collections</artifactId>......
  • 建设招商农业邮政工商一体化模拟器,回执单转账余额截图都可以,JAVA模拟代码!
    闲着用JAVA研究了一个模拟器,但是我加了水印的,这个你做不了啥坏事,主要就是学习一下我写的代码和代码的实现逻辑,包括“主类和模块”还有“截图生成模块”以及“信息的输入和处理”三大模块,说复杂不复杂,说简单也不简单,下面框架图是网上找的,需要和代码相互结合才能实现具体的效果。UI......