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

ops/2024/9/25 8:33:44/

文章目录

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

前言

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


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

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

二、使用介绍

1.使用方法

(1)构造方式:

java">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.实操展示

代码如下(示例):

java">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提供了强大的功能仍需要我们在实践中不断的学习和积累经验,有拓展或指正的内容欢迎在评论区中留言。


http://www.ppmy.cn/ops/19485.html

相关文章

富格林:可信方针实现安全盈利

富格林指出,现货黄金一直以来都是投资者们追捧的热门品种之一。其安全性和保值增值的特性吸引着广大投资者。然而,要在现货黄金市场中取得成功并非易事,是需要一定的可信技巧和方针来支撑的。下面富格林将介绍一些关键的可信方针,…

java:基于guava ClassPath工具实现基于包名(package)的类扫描

google的guava库提供了一个类路径扫描的实用工具ClassPath(参见说明&#xff1a; https://github.com/google/guava/wiki/ReflectionExplained#classpath)工具&#xff0c;适用于非android的Java平台搜索类。基于它可以设计一个过滤包名的搜索工具。 导入依赖库 <dependen…

CSS基础选择器

标签选择器&#xff1a;标签名 p{ font-size:16px;} 类选择器&#xff1a;.class { font-size:16px;} <标签名 class "类名称">标签内容</标签名> id选择器&#xff1a;#id { font-size:16px;} <标签名 id "id名称">标签内容</标签…

软件需求管理规程(Word原件2024)

软件开发人员及用户往往容易忽略信息沟通&#xff0c;这导致软件开发出来后不能很好地满足用户的需要&#xff0c;从而造成返工。而返工不仅在技术上给开发人员带来巨大的麻烦&#xff0c;造成人力、物力的浪费&#xff0c;而且软件的性能也深受影响。所以在软件项目开发周期的…

Compose和Android View相互使用

文章目录 Compose和Android View相互使用在Compose中使用View概述简单控件复杂控件嵌入XML布局 在View中使用Compose概述在Activity中使用Compose在Fragment中使用Compose布局使用多个ComposeView 在布局中使用Compose 组合使用 Compose和Android View相互使用 在Compose中使用…

int和byte数组相互转换详解

转换之前我们需要了解各种进制之间的关系&#xff0c;不太了解的可以先看下计算机组成原理和体系 这篇文章 byte byte是字节的意思&#xff0c;一个字节等于8位&#xff0c;范围是 0000 0000 ~ 1111 1111(十六进制&#xff1a;0x0~0xff),总共包含256个数。 有符号的byte表示的…

物联网实战--驱动篇之(九)NB-IOT(BC260)

目录 一、NB-IOT简介 二、NB-IOT要素 三、代码详解 四、平台端 一、NB-IOT简介 实际上&#xff0c;就是NB-Iot彻底引爆了物联网的&#xff0c;大概2018年左右&#xff0c;NB推广如火如荼&#xff0c;同时广域网、低功耗的LPWAN网络也逐渐传开&#xff0c;现在回头来看&…

springboot项目打war包,并且部署外部tomcat中

参考&#xff1a;SpringBoot项目打包成war包并部署在tomcat上运行的操作步骤_java_脚本之家