package cn.ezhizao.common.utils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 * 压缩算法类
 * 实现文件压缩，文件夹压缩，以及文件和文件夹的混合压缩
 * @author zhushan
 *
 */
public class ZipUtils {

		/**
		 * 完成的结果文件--输出的压缩文件
		 */
		File targetFile;


		public ZipUtils(File target) {
			targetFile = target;
			if (targetFile.exists()){
				targetFile.delete();
			}
		}

		/**
		 * 压缩文件
		 *
		 * @param srcfile 源文件
		 */
		public void zipFiles(File srcfile) {

			ZipOutputStream out = null;
			try {
				out = new ZipOutputStream(new FileOutputStream(targetFile));

				if(srcfile.isFile()){
					zipFile(srcfile, out, "");
				} else{
					File[] list = srcfile.listFiles();
					if(list!=null) {
						for (File file : list) {
							compress(file, out, "");
						}
					}
				}
				System.out.println("压缩完毕");
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				try {
					if (out != null){
						out.close();
					}
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}

		/**
		 * 压缩文件夹里的文件
		 * 起初不知道是文件还是文件夹--- 统一调用该方法
		 * @param file 文件
		 * @param out 输出流
		 * @param basedir 基础文件目录
		 */
		private void compress(File file, ZipOutputStream out, String basedir) {
			/* 判断是目录还是文件 */
			if (file.isDirectory()) {
				this.zipDirectory(file, out, basedir);
			} else {
				this.zipFile(file, out, basedir);
			}
		}

		/**
		 * 压缩单个文件
		 *
		 * @param srcfile 文件
		 */
		public void zipFile(File srcfile, ZipOutputStream out, String basedir) {
			if (!srcfile.exists()) {
				return;
			}

			byte[] buf = new byte[1024];
			FileInputStream in = null;

			try {
				int len;
				in = new FileInputStream(srcfile);
				out.putNextEntry(new ZipEntry(basedir + srcfile.getName()));

				while ((len = in.read(buf)) > 0) {
					out.write(buf, 0, len);
				}
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				try {
					if (out != null) {
						out.closeEntry();
					}
					if (in != null) {
						in.close();
					}
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}

		/**
		 * 压缩文件夹
		 * @param dir 文件夹
		 * @param out 输出流
		 * @param basedir 基础文件目录
		 */
		public void zipDirectory(File dir, ZipOutputStream out, String basedir) {
			if (!dir.exists()) {
				return;
			}

			File[] files = dir.listFiles();
			if(files!=null) {
				for (File file : files) {
					/* 递归 */
					compress(file, out, basedir + dir.getName() + "/");
				}
			}
		}



	}
