java使用ZipOutputStream对文件进行压缩

简介: java中常用ZipOutStream进行文件的压缩,用ZipInputStream对文件进行解压,zip相对于其他的文件的io稍有一点点不同的就是:它的内部就是一个小型的文件系统。如果是一个文件夹所有文件都是文档二不是文件夹。那还好办直接操作。如果涉及到文件夹和文档的不固定分布。那就需要仔细考虑下。这里用递归进行遍历。

java处理文件压缩的类



java中常用ZipOutStream进行文件的压缩,用ZipInputStream对文件进行解压,zip相对于其他的文件的io稍有一点点不同的就是:它的内部就是一个小型的文件系统。如果是一个文件夹所有文件都是文档二不是文件夹。那还好办直接操作。如果涉及到文件夹和文档的不固定分布。那就需要仔细考虑下。这里用递归进行遍历。


ZipOutStream压缩文件


主要两个方法:


1.putNextEntry(new ZipEntry(""))


这里面重要的就是ZipEntry这个概念首先要懂。ZipEntry是zip下面的文件条目,你可以比作外面系统的File类似。后面的参数就是在zip目录下的相对位置。所以这里有一点比较重要的就是当你遍历文件夹的时候你的ZipEntry的参数的改变规律。写不好的话会使整个文件目录混乱(如果文件层级较低那就不碍事)。而putNextEntry(ZipEntry z)的意思就是我下面io操作(写入)都是在z这个文件条目下进行的。


2.write()


这个zipoutputstream流和其他的output流不一样的地方就是BufferedOutputStream不能嵌套它。也就是它不能套缓存流用。


对于文件夹下包含文件夹需要特殊考虑。判断它是不是文件夹。文件夹的话要遍历他的子节点文件。用递归思想。已在代码中给出注释。还有文件要注意相对绝对路径。


贴上我的模板代码:


import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class test1 {
  public static void main(String[] args) throws IOException {
    String filepath="F:\\fileget\\二班";//目标文件夹
    String zipname="F:\\fileget\\二班软工作业.zip";//目标输出路径
    filetozip(filepath,zipname);
  }
  public static void filetozip(String filepath,String zipname) throws IOException {
    File file=new File(filepath);
    OutputStream outputStream=new FileOutputStream(zipname);
    ZipOutputStream zipout=new ZipOutputStream(outputStream); 
    //递归函数  三个参数分别代表 1:当前zipout流 2:当前文件/文件夹 3:在zip下的path
    dozip(zipout,file,""); 
    zipout.finish();
    zipout.close();
    outputStream.close();
  }
   private static void dozip(ZipOutputStream zipout, File file, String addpath) throws IOException {
        if(file.isDirectory())
        {
            File f[]=file.listFiles();
            for(int i=0;i<f.length;i++)
            {
                if(f[i].isDirectory()) {
                    dozip(zipout, f[i], addpath+f[i].getName()+"/");
                }
                else {
                    dozip(zipout, f[i], addpath+f[i].getName());
                }
            }
        }
        else
        {
            InputStream input;
            BufferedInputStream buff;
            zipout.putNextEntry(new ZipEntry(addpath));
            input=new FileInputStream(file);
            buff=new BufferedInputStream(input);
            byte b[]=new byte[1024*5];
            int a=0;
            while((a=buff.read(b))!=-1)
            {
                zipout.write(b);
            }
            buff.close();
            input.close();
            System.out.println(file.getName());
        }
    }
  }

20190419192241389.png20190419192355378.png


另外,解压的那个类后面有时间会补充下来。

目录
相关文章
|
3天前
|
分布式计算 DataWorks Java
DataWorks操作报错合集之在使用MaxCompute的Java SDK创建函数时,出现找不到文件资源的情况,是BUG吗
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
16 0
|
8天前
|
Java Unix Windows
|
12天前
|
Java 关系型数据库 MySQL
Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
【4月更文挑战第12天】Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
47 3
|
1天前
|
存储 监控 Java
如何在Java中实现等待文件修改后再读取数据的功能?
如何在Java中实现等待文件修改后再读取数据的功能?
4 0
|
1天前
|
存储 Java 数据格式
Java实战:轻松掌握文件重命名与路径提取技巧
Java实战:轻松掌握文件重命名与路径提取技巧
6 0
|
1天前
|
Java
如何解决使用若依前后端分离打包部署到服务器上后主包无法找到从包中的文件的问题?如何在 Java 代码中访问 jar 包中的资源文件?
如何解决使用若依前后端分离打包部署到服务器上后主包无法找到从包中的文件的问题?如何在 Java 代码中访问 jar 包中的资源文件?
7 0
|
4天前
|
存储 Java Linux
【Java EE】 文件IO的使用以及流操作
【Java EE】 文件IO的使用以及流操作
|
5天前
|
存储 缓存 安全
【专栏】如何在 Java 中创建临时文件?
【4月更文挑战第28天】本文介绍了Java中创建临时文件的两种方法:使用`File.createTempFile`和自定义创建。`File.createTempFile`能生成唯一文件名,但默认不自动删除;自定义创建则提供更大灵活性,但需手动管理。临时文件常用于数据缓存、文件上传下载和日志记录,使用时需注意文件清理、唯一性和权限设置。
|
7天前
|
存储 前端开发 Java
Java实现文件分片上传
Java实现文件分片上传
8 0
|
12天前
|
Java 测试技术 持续交付
云效产品使用常见问题之通过流水线构建的java代码,在docker文件里拿到失败如何解决
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。