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

文章目录


前言

        该篇文章将会介绍如何使用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提供了强大的功能仍需要我们在实践中不断的学习和积累经验,有拓展或指正的内容欢迎在评论区中留言。

  • 29
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java中,可以使用ZipOutputStream类将输入压缩zip文件。下面是一个示例代码: ```java import java.io.*; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; public class ZipInputSteamExample { public static void main(String[] args) { String inputFilePath = "input.txt"; String zipFilePath = "output.zip"; try { // 创建输入 FileInputStream inputStream = new FileInputStream(inputFilePath); // 创建输出 FileOutputStream outputStream = new FileOutputStream(zipFilePath); // 创建Zip输出 ZipOutputStream zipOutputStream = new ZipOutputStream(outputStream); // 添加Zip实体 zipOutputStream.putNextEntry(new ZipEntry(inputFilePath)); // 缓冲区 byte[] buffer = new byte[1024]; int length; // 读取输入内容并写入Zip输出 while ((length = inputStream.read(buffer)) >= 0) { zipOutputStream.write(buffer, 0, length); } // 关闭输入 inputStream.close(); // 关闭Zip实体 zipOutputStream.closeEntry(); // 关闭Zip输出 zipOutputStream.close(); System.out.println("文件已成功压缩zip!"); } catch (IOException e) { System.out.println("压缩过程出现异常:" + e.getMessage()); } } } ``` 在上述代码中,首先创建了输入和输出。然后,通过ZipOutputStream类的putNextEntry()方法添加要压缩文件。接下来,使用一个缓冲区读取输入的内容,并将其写入Zip输出中。最后,关闭输入、关闭Zip实体、关闭Zip输出。 执行上述代码后,会生成一个名为output.zip压缩文件,其中包含了输入文件input.txt的内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喵果森森

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值