package cn.jcenterhome.util; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.Enumeration; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import java.util.zip.ZipOutputStream; public class ZipUtil { private final int BUFFER = 2048; private int decompress_count = 0; private int decompress_file_count = 0; private int decompress_folder_count = 0; public boolean compress(String zipFileName, File sourceFile) { FileOutputStream fos = null; ZipOutputStream zos = null; try { fos = new FileOutputStream(zipFileName); zos = new ZipOutputStream(fos); if (!zip(zos, sourceFile, sourceFile.getName())) { throw new Exception(); } zos.close(); } catch (Exception e) { try { if (fos != null) fos.close(); if (zos != null) zos.close(); } catch (IOException ioe) { } deleteDir(new File(zipFileName)); return false; } return true; } public boolean compress(String zipFileName, File[] files) { FileOutputStream fos = null; ZipOutputStream zos = null; try { fos = new FileOutputStream(zipFileName); zos = new ZipOutputStream(fos); for (File f : files) { if (!zip(zos, f, f.getName())) { throw new Exception(); } } zos.close(); } catch (Exception e) { try { if (fos != null) fos.close(); if (zos != null) zos.close(); } catch (IOException ioe) { } deleteDir(new File(zipFileName)); return false; } return true; } @SuppressWarnings("unchecked") public boolean decompress(ZipFile zipFile, String toDir, String fileSuffix) { decompress_count = 0; decompress_file_count = 0; decompress_folder_count = 0; BufferedInputStream bis = null; BufferedOutputStream bos = null; try { String separator = File.separator; Enumeration e = zipFile.entries(); ZipEntry entry = null; byte[] datas = null; while (e.hasMoreElements()) { entry = (ZipEntry) e.nextElement(); if (fileSuffix != null && !entry.getName().endsWith(fileSuffix)) { continue; } if (entry.isDirectory()) { File dir = new File(toDir + separator + entry.getName()); dir.mkdirs(); decompress_folder_count++; } else { File file = new File(toDir + separator + entry.getName()); bis = new BufferedInputStream(zipFile.getInputStream(entry)); bos = new BufferedOutputStream(new FileOutputStream(file)); int byteNum; datas = new byte[BUFFER]; while ((byteNum = bis.read(datas, 0, BUFFER)) != -1) { bos.write(datas, 0, byteNum); } bos.flush(); bos.close(); bis.close(); decompress_file_count++; } decompress_count++; } } catch (Exception e) { try { if (bos != null) bos.close(); if (bis != null) bis.close(); } catch (IOException ioe) { } deleteDir(new File(toDir)); return false; } return true; } @SuppressWarnings("unchecked") public boolean decompress(ZipFile zipFile, String toDir) { return decompress(zipFile, toDir, null); } public void entryToFile(ZipFile zipFile, ZipEntry entry, File file) { BufferedInputStream bis = null; BufferedOutputStream bos = null; try { bis = new BufferedInputStream(zipFile.getInputStream(entry)); bos = new BufferedOutputStream(new FileOutputStream(file)); int byteNum; byte[] datas = new byte[BUFFER]; while ((byteNum = bis.read(datas, 0, BUFFER)) != -1) { bos.write(datas, 0, byteNum); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (bos != null) bos.close(); if (bis != null) bis.close(); } catch (IOException ioe) { } } } public String getEntryContent(ZipFile zipFile, ZipEntry entry) { BufferedInputStream bis = null; try { bis = new BufferedInputStream(zipFile.getInputStream(entry)); StringBuffer strBuf = new StringBuffer(); byte[] datas = new byte[BUFFER]; while (bis.read(datas, 0, BUFFER) != -1) { strBuf.append(new String(datas)); } return strBuf.toString(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (bis != null) bis.close(); } catch (IOException e) { } } return null; } @SuppressWarnings("unchecked") public ZipEntry getFirstEntry(ZipFile zipFile) { Enumeration e = zipFile.entries(); if (e.hasMoreElements()) { return (ZipEntry) e.nextElement(); } return null; } public int getDecompressCount() { return decompress_count; } public int getDecompressFileCount() { return decompress_file_count; } public int getDecompressFolderCount() { return decompress_folder_count; } private boolean zip(ZipOutputStream zos, File sourceFile, String entryPath) { if (entryPath == null) { entryPath = ""; } BufferedInputStream bis = null; try { if (sourceFile.isDirectory()) { if (entryPath.length() != 0) { entryPath += "/"; } ZipEntry entry = new ZipEntry(entryPath); zos.putNextEntry(entry); File[] folder = sourceFile.listFiles(); for (File file : folder) { if (!zip(zos, file, entryPath + file.getName())) { throw new Exception(); } } } else { ZipEntry entry = new ZipEntry(entryPath); zos.putNextEntry(entry); FileInputStream fis = new FileInputStream(sourceFile); bis = new BufferedInputStream(fis, BUFFER); int byteNum; byte[] datas = new byte[BUFFER]; while ((byteNum = bis.read(datas, 0, BUFFER)) != -1) { zos.write(datas, 0, byteNum); } bis.close(); } } catch (Exception e) { return false; } finally { try { if (bis != null) bis.close(); } catch (IOException ioe) { } } return true; } private void deleteDir(File del) { if (del != null && del.exists()) { if (del.isDirectory()) { File[] files = del.listFiles(); for (File f : files) { if (f.isFile()) { f.delete(); } else { deleteDir(f); } } } else { del.delete(); } } } }