java使用ZipOutputStream对文件进行压缩

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());
        }

    }
    
  }

在这里插入图片描述
在这里插入图片描述
另外,解压的那个类后面有时间会补充下来。

  • 如果对后端、爬虫、数据结构算法等感性趣欢迎关注我的个人公众号交流:bigsai
Big sai CSDN认证博客专家 scikit-learn
关注微信公众号:bigsai,回复进群即可加入leetcode打卡群,回复bigsai获取珍藏pdf一份。江科大本,南理研一。平凡的日子里努力充实自己,努力学习,努力分享。期待你的关注!
©️2020 CSDN 皮肤主题: 代码科技 设计师:Amelia_0503 返回首页