package com.superstar.util; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.util.Enumeration; import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipFile; import org.apache.tools.zip.ZipOutputStream; /** * 1 * 对文件加密/解密和压缩/解压缩对象类 2 * * * @author */ public class ZipUtil { /** * 方法说明: * @param sourcePath 要压缩的文件 * @param zipPath 压缩后文件 * @param pwd 压缩密码 * @return * @throw * a 压缩 e 解压缩 * -dr 压缩后删除原文件 */ @SuppressWarnings("unused") private static int winRarZip(String sourcePath,String zippath, String pwd,boolean isDel) { int flag = 0; if (("".equals(sourcePath) || null == sourcePath)&&("".equals(zippath) || null == zippath)) { System.out.println("路径不存在!"); return flag; } Runtime run = Runtime.getRuntime(); // 读取注册表 winrar所在的路径 String winPath = ZipUtil.readRegedit(); winPath = winPath + "//WinRAR.exe"; String cmd=""; if(isDel==true){ cmd = winPath + " a -dr -p"+pwd+" "+ zippath + ".zip "+sourcePath; }else{ cmd = winPath + " a -p"+pwd+" "+ zippath + ".zip "+sourcePath; } System.out.println(cmd); Process p = null; try { p = run.exec(cmd); p.waitFor();// 等待结束 } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } p.destroy();// 销毁 flag = 1; return flag; } /** * 方法说明:解压文件 * @param path zip或rar文件路径 * @param pwd 压缩密码 * @param despath 解压目的地,默认当前路径 * @return * @throw * */ public static int winRarUnFile(String path, String pwd, String despath) { int flag = 0; try { Runtime run = Runtime.getRuntime(); File fl = new File(path); if (!fl.exists()) { throw new Exception("zip文件不存在!"); } //读取注册表 winrar所在的路径 String rarPath = ZipUtil.readRegedit(); //SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); // String date = sdf.format(new Date()); //如果目的地为空,默认解压到当前路径 if ("".equals(despath) || null == despath) { int ix = path.lastIndexOf(".zip"); despath = path.substring(0, ix); File d = new File(despath);//路径+当前日期(避免服务器解压重复) if (!d.exists()) { d.mkdir(); } else { if (ZipUtil.delDir(despath)) {//删除文件夹里所有文件 d.mkdir(); } } } String cmd = ""; if ("".equals(pwd) || null == pwd) {//如果密码为空 cmd = "" + rarPath + "//WinRAR.exe e -o+ " + path + " " + despath; } else { cmd = "" + rarPath + "//WinRAR.exe x -o+ " + path + " -p" + pwd + " " + despath; } Process p = run.exec(cmd); p.waitFor();//等待结束 p.destroy();//销毁 flag = 1; } catch (Exception e) { LogUtil.writeError(ZipUtil.class, "ZipUtil.winRarUnFile() -> " + e.getMessage()); } return flag; } /** * 方法说明:读取注册表,winrar安装路径 * @throw */ private static String readRegedit() { String cmd = "reg query /"HKEY_LOCAL_MACHINE//SOFTWARE//Microsoft//Windows//CurrentVersion//App Paths//WinRAR.exe/""; //String cmd="reg query /"HKEY_LOCAL_MACHINE//SOFTWARE//Classes//WinRAR//shell//open//command/""; String path = ""; try { Runtime run = Runtime.getRuntime(); Process ps = run.exec(cmd); ps.getOutputStream().close(); InputStreamReader i = new InputStreamReader(ps.getInputStream()); String line; BufferedReader ir = new BufferedReader(i); String[] values = null; while ((line = ir.readLine()) != null) { values = line.split("/t"); } ps.waitFor();//等待结束 ps.destroy();//销毁 if (values != null && !"".equals(values)) { int len = values.length; path = values[len - 1]; } } catch (Exception e) { LogUtil.writeError(ZipUtil.class, "ZipUtil.readRegedit() -> " + e.getMessage()); } return path; } /*===================Ant 解决中文======================*/ /** * 功能:把 sourceDir 目录下的所有文件进行 zip 格式的压缩,保存为指定 zip 文件 * * @param sourceDir * @param zipFile */ public static void antZip(String sourceDir, String zipFile) { System.out.println("开始压缩文件..."); OutputStream os = null; try { os = new FileOutputStream(zipFile); BufferedOutputStream bos = new BufferedOutputStream(os); ZipOutputStream zos = new ZipOutputStream(bos); zos.setEncoding("GBK"); File file = new File(sourceDir); String basePath = null; if (file.isDirectory()) { basePath = file.getPath(); } else {// 直接压缩单个文件时,取父目录 basePath = file.getParent(); } zipFile(file, basePath, zos); zos.closeEntry(); zos.close(); System.out.println("压缩文件成功!"); } catch (Exception e) { LogUtil.writeError(ZipUtil.class, "ZipUtil.antZip() -> " + e.getMessage()); } } /** * 执行文件压缩成zip文件 * * @param source * @param basePath 待压缩文件根目录 * @param zos */ private static void zipFile(File source, String basePath, ZipOutputStream zos) { File[] files = new File[0]; if (source.isDirectory()) { files = source.listFiles(); } else { files = new File[1]; files[0] = source; } String pathName;// 存相对路径(相对于待压缩的根目录) byte[] buf = new byte[1024]; int length = 0; try { for (File file : files) { if (file.isDirectory()) { pathName = file.getPath().substring(basePath.length() + 1) + "/"; zos.putNextEntry(new org.apache.tools.zip.ZipEntry(pathName)); zipFile(file, basePath, zos); } else { pathName = file.getPath().substring(basePath.length() + 1); InputStream is = new FileInputStream(file); BufferedInputStream bis = new BufferedInputStream(is); zos.putNextEntry(new org.apache.tools.zip.ZipEntry(pathName)); while ((length = bis.read(buf)) > 0) { zos.write(buf, 0, length); } is.close(); } } } catch (Exception e) { LogUtil.writeError(ZipUtil.class, "ZipUtil.antZip() -> " + e.getMessage()); } } /** * 功能:解压 zip 文件,只能解压 zip 文件 * * @param zipfile * @param destDir */ @SuppressWarnings("unchecked") public static void antUnZip(String zipfile, String destDir) { destDir = destDir.endsWith("//") ? destDir : destDir + "//"; byte b[] = new byte[1024]; int length; ZipFile zipFile; try { System.out.println("开始解压缩文件..."); zipFile = new ZipFile(new File(zipfile)); Enumeration enumeration = zipFile.getEntries(); ZipEntry zipEntry = null; while (enumeration.hasMoreElements()) { zipEntry = (ZipEntry)enumeration.nextElement(); File loadFile = new File(destDir + zipEntry.getName()); if (zipEntry.isDirectory()) { loadFile.mkdirs(); } else { if (!loadFile.getParentFile().exists()) { loadFile.getParentFile().mkdirs(); } OutputStream outputStream = new FileOutputStream(loadFile); InputStream inputStream = zipFile.getInputStream(zipEntry); while ((length = inputStream.read(b)) > 0) { outputStream.write(b, 0, length); } //关闭流 outputStream.flush(); outputStream.close(); inputStream.close(); } } System.out.println("解压缩文件成功!"); } catch (IOException e) { LogUtil.writeError(ZipUtil.class, "ZipUtil.antUnZip() -> " + e.getMessage()); } } }