java将有关zip压缩的内容都封装在java.util.zip宝中,用java实现zip压缩,不用考虑压缩算法,java已经将这些进行了封装
实际上用java实现zip压缩涉及的就是一个“输入输出流”的概念
用java实现一个文件的zip压缩,过程可以简单地表示为:
当然具体实现要比这个复杂一点,比如要先像zip文件中写入目录进入点。。如果要压缩文件夹中的内容要遍历文件夹中的文件和子文件夹。
/** * @author: hxp * @date: 2019/3/30 18:09 * @description:zip压缩工具 */ public class ZipCompress { /** * 目的地Zip文件 */ private String zipFileName; /** * 源文件(待压缩的文件或文件夹) */ private String sourceFileName; public ZipCompress(String zipFileName,String sourceFileName) { this.zipFileName=zipFileName; this.sourceFileName=sourceFileName; } public void zip() throws Exception { //File zipFile = new File(zipFileName); System.out.println("压缩中..."); //创建zip输出流 ZipOutputStream out = new ZipOutputStream( new FileOutputStream(zipFileName)); //创建缓冲输出流 BufferedOutputStream bos = new BufferedOutputStream(out); File sourceFile = new File(sourceFileName); //调用函数 compress(out,bos,sourceFile,sourceFile.getName()); bos.close(); out.close(); System.out.println("压缩完成"); } public void compress(ZipOutputStream out,BufferedOutputStream bos,File sourceFile,String base) throws Exception { //如果路径为目录(文件夹) if(sourceFile.isDirectory()) { //取出文件夹中的文件(或子文件夹) File[] list = sourceFile.listFiles(); //如果文件夹为空,则只需在目的地zip文件中写入一个目录进入点 if(list.length==0) { System.out.println(base+"/"); out.putNextEntry( new ZipEntry(base+"/") ); } else//如果文件夹不为空,则递归调用compress,文件夹中的每一个文件(或文件夹)进行压缩 { for(int i=0;i<list.length;i++) { compress(out,bos,list[i],base+"/"+list[i].getName()); } } } else//如果不是目录(文件夹),即为文件,则先写入目录进入点,之后将文件写入zip文件中 { out.putNextEntry( new ZipEntry(base) ); FileInputStream fos = new FileInputStream(sourceFile); BufferedInputStream bis = new BufferedInputStream(fos); int tag; System.out.println(base); //将源文件写入到zip文件中 while((tag=bis.read())!=-1) { bos.write(tag); } bis.close(); fos.close(); } } }