ZIP压缩输入流(将文件压缩为ZIP文件)

文章目录

  • 前言
  • 一、ZIP压缩输入流是什么?
  • 二、使用介绍
    • 1.使用方法
    • 2.实操展示
  • 总结

前言

        该篇文章将会介绍如何使用java代码将各种文件(文件夹)的资源压缩为一个ZIP压缩包。通过java.util包中的ZipOutputStream类来实现。并且需要自定义压缩方法,分别创建两个文件对象参数,一个为被压缩的文件,另一个为压缩包文件对象。需要压缩包对象套入文件输入流FileOutputStream流对象,可以被输入数据。文件输入流对象套入压缩流对象,可以被执行压缩的一系列操作。具体如何实现的,看下面的文章展示。


一、ZIP压缩输入流是什么?

        Zip压缩输入流是指将数据压缩为Zip格式的输入流。ZIP压缩管理文件是一种十分经典的文件压缩形式,使用它可以节约存储空间。对于ZIP压缩的I/O实现,使用java.util.zip包中的ZipOutputStream与ZipInputStream类来实现文件的压缩/解压缩。    

二、使用介绍

1.使用方法

(1)构造方式:

new ZipOutputStream(OutputStream out);

 (2)常用方法:

ZipOutputStream类的常用构造方法
方法功能描述
putNextEntry(ZipEntry e)开始写入一个新的ZipEntry(压缩条目)到压缩文件中
write(byte[] b,int off,int len)将字节数组数据写入当前ZIP条目
finish()完成写入ZIP输出流的内容。在调用finish()方法之后,应该调用close()方法来释放资源
setComment(String comment)可设置此ZIP文件的注释文字
closeEntry()关闭ZIP条目(即文件或文件夹)

问题:closeEntry()对比finish()和close()方法有什么区别?

         在Java中,closeEntry()是用于关闭当前的ZIP条目的方法,主要用于处理ZIP文件的输入流。而finish()close()方法则是用于处理输出流。

具体区别如下:

  • closeEntry()方法是ZipInputStream类的方法,用于关闭当前的ZIP条目,以便读取下一个ZIP条目。
  • finish()方法是ZipOutputStream类的方法,用于结束ZIP文件的写入操作,并关闭输出流。
  • close()方法是InputStream和OutputStream类的方法,用于关闭输入流和输出流。

2.实操展示

代码如下(示例):

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

public class Demo{
    
    /*
     * @被压缩的文件对象
     * @压缩包文件对象
     */
    static void compress(File source,File target){  //压缩方法
        
        try (FileOutputStream fis = new FileOutputStream(target);
                ZipOutputStream zos = new ZipOutputStream(fis)){
            if(source.isDirectory()){
                for(File f:source.listFiles()){
                    addEntry(zos,f,"");
                }
            }else{
                addEntry(zos, source,"");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /*
     * @压缩流对象
     * @被压缩文件对象
     * @被压缩文件的路径
     */
    static void addEntry(ZipOutputStream zos,File source,String base){  //实际上的压缩操作和添加条目
        if(source.isDirectory()){   //使用了递归的方法
            for(File file:source.listFiles()){
                addEntry(zos,file,base+source.getName()+File.separator);
            }
        }else{//实际写入条目操作
            byte buf[]=new byte[1024];
            try (FileInputStream fis = new FileInputStream(source)){
                int count = -1;
                //在压缩包中添加新条目
                zos.putNextEntry(new ZipEntry(base+source.getName()));
                while((count = fis.read(buf))!=-1){
                    zos.write(buf,0, count);
                    zos.flush();
                }
                zos.closeEntry();   //关闭条目
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        compress(new File("D:\\word\\"), new File("D:/word.zip"));
    }
}

被压缩的文件夹所包含的文件 

 

运行结果: 


        第一,值得注意的是,使用java压缩文件时,要进行一项操作,“添加条目”,所谓的条目就是压缩包中一条一条的文件(或文件夹),如下图所示: 

        test文件夹和word.txt文件在这个压缩包中各自占据一个条目。

        "添加条目"这个操作有三个步骤:

(1)创建一行条目,使用putNextEntry(ZipEntry e),压缩包中显示这一行的文件(夹)。

(2)压缩流将从被压缩文件读出的数据写入该条目(while循环读取压缩文件),直到读完。

(3)关闭该行条目。

         第二,以上示例采用了递归的方法,在自定义方法addEntry()中若被压缩文件是文件夹,将再次调用addEntry()方法,改变方法上的压缩文件路径参数,即base+source.getName()+File.separator。(File.separator为"\",表示该文件夹在压缩包中的路径,文件夹中的文件都会压缩在这条路径中)

        第三, 该示例写的两个自定义方法可以看为一个表子,一个里子。compress()方法实际上创建了一个空的zip文件。compress()中调用addEntry()方法才是实质上将被压缩文件的数据写入到zip文件里

        第四,addEntry()方法中一开始引入空的String base被压缩文件路径,是为了在处理压缩一层或多次文件夹时,递归调用自身方法时,不断更新被压缩文件的正确路径。这是为了应对复杂的文件文件夹关系。


总结

        以上就是如何使用java压缩各种文件和文件夹的内容了,本文仅仅简单介绍了压缩流的使用,而ZipOutputStream提供了强大的功能仍需要我们在实践中不断的学习和积累经验,有拓展或指正的内容欢迎在评论区中留言。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

记录些AI Agents设计模式和NL2SQL知识

吴恩达分享的四种 自我反思(Reflection):可以自我修正;使用工具(Tool Use):链接其他系统去做一些事情,比如把电脑里面的未归档文件做好归档;规划(Planning&a…

免费实用在线小工具

免费在线工具 https://orcc.online/ pdf在线免费转word文档 https://orcc.online/pdf 时间戳转换 https://orcc.online/timestamp Base64 编码解码 https://orcc.online/base64 URL 编码解码 https://orcc.online/url Hash(MD5/SHA1/SHA256…) 计算 https://orcc.online/ha…

软考之零碎片段记录(二十七)+复习巩固(十三、十四)

学习 1. 案例题 涉及到更新的。肯能会是数据流的终点E, P, D 数据流转。可能是 P->EP->D(数据更新)P->P(信息处理)D->P(提取数据信息) 2. 案例2 补充关系图时会提示不增加新的实体。则增加关联关系 3. 案例3 用例图 extend用于拓展,当一个用例…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-1.3

前言: 本文是根据哔哩哔哩网站上视频“正点原子[第二期]Linux之ARM(MX6U)裸机篇”的学习笔记,在这里会记录下正点原子Linux ARM MX6ULL 开发板根据配套的哔哩哔哩学习视频所作的实验和笔记内容。本文大量的引用了正点原子哔哔哩网…

Python 单例类中设置和获取属性的问题及解决方案

1、问题背景 在编写 Python 代码时,有时需要创建一个单例类,这样就可以在程序中使用该类的唯一实例。为了实现这一点,可以定义一个类,并在其 __new__ 方法中检查该类的实例是否已经存在。如果实例存在,则返回该实例&a…

stm32f4单片机强制类型转换为float程序跑飞问题

如题,在一个数据解析函数中使用了*(float *)&data[offset],其中data为uint8类型指针,指向的value地址为 可以看到地址0x20013A31非对齐,最终在执行VLDR指令时导致跑飞 VLDR需要使用对齐访问 跑飞后查看SCB寄存器发现确实是非…

未授权/敏感信息/越权检测插件-BurpAPIFinder

简介 攻防演练过程中,我们通常会用浏览器访问一些资产,但很多未授权/敏感信息/越权隐匿在已访问接口过html、JS文件等,通过该Burp插件我们可以: 1、发现通过某接口可以进行未授权/越权获取到所有的账号密码、私钥、凭证 2、发现通…

【顺序表小题】

顺序表小题 移除元素思路一思路二 合并两个有序数组思路一思路二 移除元素 链接: 题目链接 思路一 创建新的数组,遍历原数组,将不为val的值放到新数组中 思路二 双指针法。 创建两个变量src,dst。 1)若src指向的值为val,则src 2)若sr…

点击劫持:X-Frame-Options未配置、nginx配置X-Frame-Options响应头

nginx配置X-Frame-Options响应头 X-Frame-Options X-Frame-Options 有三个值: DENY 表示该页面不允许在 frame 中展示,即便是在相同域名的页面中嵌套也不允许。SAMEORIGIN 表示该页面可以在相同域名页面的 frame 中展示。ALLOW-FROM uri 表示该页面可…

TechTool Pro for mac中文激活版:硬件监测和系统维护工具

TechTool Pro mac帮助用户实现系统硬件监测(CPU、内存、硬盘、网络、USB等)、内存测试、S.M.A.R.T检测、磁盘宗卷扫描、宗卷重建和优化、数据恢复和粉碎等等,定期使用,可以确保您的Mac保持优化和无故障。 TechTool Pro for mac v1…

小龙虾优化算法(Crayfish Optimization Algorithm,COA)

小龙虾优化算法(Crayfish Optimization Algorithm,COA) 前言一、小龙虾优化算法的实现1.初始化阶段2.定义温度和小龙虾的觅食量3.避暑阶段(探索阶段)4.竞争阶段(开发阶段)5.觅食阶段&#xff08…

Github进行fork后如何与原仓库同步[解决git clone 太慢的问题]

前言 fork了一个仓库以后怎么同步源仓库的代码? 先说一下git clone太慢的问题,可以通过代理拉取代码,具体请看: https://gitclone.com/ 步骤 1、执行命令 git remote -v 查看你的远程仓库的路径。 以一个实际例子说明&#x…

场外个股期权开户新规及操作方法

场外个股期权开户新规 场外个股期权开户新规主要涉及对投资者资产实力、专业知识、风险承受能力和诚信记录的要求。以下是根据最新规定总结的关键要点: 来源/:股指研究院 资产门槛:投资者需具备一定的资产实力,确保在申请开户前…

Maven | 依赖

Maven项目结构 Pom代码 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.…

Android 14设置android:importantForAutofill=“no“无效

密码输入框EditText不希望弹出Google的是否保存密码弹出框&#xff0c; 直接设置了android:importantForAutofill"no"&#xff0c; android:inputType"textPassword|textNoSuggestions"在安卓12手机上有效&#xff0c;但是在安卓14上面就不行了&#xff0…

前端高并发的出现场景及解决方法——技能提升——p-limit的使用

最近在写后台管理系统的时候&#xff0c;遇到一个场景&#xff0c;就是打印的页面需要根据传入的多个id&#xff0c;分别去请求详情接口。 比如id有10个&#xff0c;则需要调用10次详情接口获取到数据&#xff0c;最后对所有的数据进行整合后页面渲染。 相信大家或多或少都遇到…

MF(推荐系统的矩阵分解技术)论文笔记

论文概述 推荐系统的矩阵分解技术可以为用户提供更为准确的个性化推荐&#xff0c;对比传统的近邻技术&#xff0c;矩阵分解技术可以纳入更多信息&#xff0c;如隐式反馈、时间效应和置信度 近邻技术&#xff1a;基于用户或物品之间的相似性进行推荐&#xff0c;当用户之间已…

基于单片机的羽毛球计分器(含proteus仿真和程序)

目录 完整文本及仿真、程序可私信我获取 前言 第一章 设计任务及方案 1.1 设计任务 1.2 总体设计分析 1.3 功能模块方案设计 1.4 方案确定 第二章、硬件设计 2.1 AT89C51 单片机芯片介绍 2.1.1 主要特性 2.1.2 管脚说明 2.1.3 元件清单 2.2 电路介绍 2…

艾体宝案例 | 使用Redis和Spring Ai构建rag应用程序

随着AI技术的不断进步&#xff0c;开发者面临着如何有效利用现有工具和技术来加速开发过程的挑战。Redis与Spring AI的结合为Java开发者提供了一个强大的平台&#xff0c;以便快速构建并部署响应式AI应用。探索这一整合如何通过简化的开发流程&#xff0c;让开发者能够更专注于…

国产统信UOS桌面操作系统安装GeoScenePro的详细教程

前提 在国产操作系统 统信UOS桌面操系统 中安装 GeoScenePro&#xff0c;本教程仅作为技术测试、并非是官方教程。欢迎沟通学习。 1、环境准备 统信UOS生态社区 - 打造操作系统创新生态https://www.chinauos.com/resource/download-professional 前往统信官网下载统信…