import java.io.File;
import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;import java.util.LinkedList;import java.util.zip.ZipEntry;import java.util.zip.ZipOutputStream;/** * * 实现将文件或文件夹压缩为zip格式的文件 * @author 周瑜 * @2018年5月19日 下午3:49:04 */public class ZipUtils { /** * 设置压缩过程中字节数组的大小 */ private static final int BUFFER_SIZE = 1024*1024; /** * 压缩多个文件或文件夹,到指定输出流中 * @param srcFiles * 需要压缩的文件列表 * @param out * 压缩文件输出流 */ public static void toZip(OutputStream out,String... filePaths) { try (ZipOutputStream zos = new ZipOutputStream(out)) { long start = System.currentTimeMillis(); for (String srcFile : filePaths) { compress(new File(srcFile), zos); } System.out.println("压缩完成,耗时:" + (System.currentTimeMillis() - start) + " ms"); } catch (Exception e) { System.err.println("压缩失败!"); e.printStackTrace(); } } /** * * 使用文件队列的方式压缩文件和文件夹 * @param file * 源文件 * @param zos * zip输出流 */ private static void compress(File file,ZipOutputStream zos) { String rootPath = file.getAbsolutePath(); String rootName = file.getName(); byte[] byts = new byte[BUFFER_SIZE]; LinkedList<File> list = new LinkedList<>(); list.addFirst(file); while(!list.isEmpty()) { File srcFile = list.removeLast(); String name = srcFile.getAbsolutePath().replace(rootPath, rootName); if (srcFile.isFile()) { try (FileInputStream input = new FileInputStream(srcFile);) { // 向zip输出流中添加一个zip实体,构造器中name为zip实体的文件的名字 zos.putNextEntry(new ZipEntry(name)); int len = 0; while ((len = input.read(byts)) != -1) { zos.write(byts, 0, len); } zos.closeEntry(); } catch (IOException e) { e.printStackTrace(); } } else { File[] listFiles = srcFile.listFiles(); if (listFiles == null || listFiles.length == 0) { // 空文件夹的处理 try { zos.putNextEntry(new ZipEntry(name + "/")); // 没有文件,不需要文件的copy zos.closeEntry(); } catch (IOException e) { e.printStackTrace(); } } else { for (File sonFile : listFiles) { list.addFirst(sonFile); } } } } } /** * 测试压缩方法 */ public static void main(String[] args) throws Exception { FileOutputStream fos2 = new FileOutputStream(new File("F:\\pic\\2.zip")); ZipUtils.toZip(fos2,"F:\\pic\\1.jpg","F:\\pic\\2.jpg"); }}