java压缩/解压缩zip格式文件

来源:互联网 发布:如何自学数控编程 编辑:程序博客网 时间:2024/05/16 13:53
1package com.resoft.util;  3import java.io.BufferedOutputStream;  4import java.io.File;  5import java.io.FileInputStream;  6import java.io.FileNotFoundException;  7import java.io.FileOutputStream;  8import java.io.IOException;  9import java.io.InputStream; 10import java.io.OutputStream; 11import java.util.Enumeration; 13import org.apache.tools.zip.ZipEntry; 14import org.apache.tools.zip.ZipFile; 15import org.apache.tools.zip.ZipOutputStream; 17/** *//*** 压缩/解压缩zip包处理类* * @author yayagepei* @date 2008-8-25*/ 23public class ZipUtil {   /** *//**    * 压缩    *     * @param zipFileName    *            压缩产生的zip包文件名--带路径,如果为null或空则默认按文件名生产压缩文件名    * @param relativePath    *            相对路径,默认为空    * @param directory    *            文件或目录的绝对路径    * @throws FileNotFoundException    * @throws IOException    * @author yayagepei    * @date 2008-8-26    */   public static void zip(String zipFileName, String relativePath,           String directory) throws FileNotFoundException, IOException {       String fileName = zipFileName;       if (fileName == null || fileName.trim().equals("")) {           File temp = new File(directory);           if (temp.isDirectory()) {               fileName = directory + ".zip";           } else {               if (directory.indexOf(".") > 0) {                   fileName = directory.substring(0, directory                           .lastIndexOf("."))                           + "zip";               } else {                   fileName = directory + ".zip";               }           }       }       ZipOutputStream zos = new ZipOutputStream(               new FileOutputStream(fileName));       try {           zip(zos, relativePath, directory);       } catch (IOException ex) {           throw ex;       } finally {           if (null != zos) {               zos.close();           }       }   }   /** *//**    * 压缩    *     * @param zos    *            压缩输出流    * @param relativePath    *            相对路径    * @param absolutPath    *            文件或文件夹绝对路径    * @throws IOException    * @author yayagepei    * @date 2008-8-26    */   private static void zip(ZipOutputStream zos, String relativePath,           String absolutPath) throws IOException {       File file = new File(absolutPath);       if (file.isDirectory()) {           File[] files = file.listFiles();           for (int i = 0; i < files.length; i++) {               File tempFile = files[i];               if (tempFile.isDirectory()) {                   String newRelativePath = relativePath + tempFile.getName()                           + File.separator;                   createZipNode(zos, newRelativePath);                   zip(zos, newRelativePath, tempFile.getPath());               } else {                   zipFile(zos, tempFile, relativePath);               }           }       } else {           zipFile(zos, file, relativePath);       }   }   /** *//**    * 压缩文件    *     * @param zos    *            压缩输出流    * @param file    *            文件对象    * @param relativePath    *            相对路径    * @throws IOException    * @author yayagepei    * @date 2008-8-26    */   private static void zipFile(ZipOutputStream zos, File file,           String relativePath) throws IOException {       ZipEntry entry = new ZipEntry(relativePath + file.getName());       zos.putNextEntry(entry);       InputStream is = null;       try {           is = new FileInputStream(file);           int BUFFERSIZE = 2 << 10;           int length = 0;           byte[] buffer = new byte[BUFFERSIZE];           while ((length = is.read(buffer, 0, BUFFERSIZE)) >= 0) {               zos.write(buffer, 0, length);           }           zos.flush();           zos.closeEntry();       } catch (IOException ex) {           throw ex;       } finally {           if (null != is) {               is.close();           }       }   }   /** *//**    * 创建目录    *     * @param zos    *            zip输出流    * @param relativePath    *            相对路径    * @throws IOException    * @author yayagepei    * @date 2008-8-26    */   private static void createZipNode(ZipOutputStream zos, String relativePath)           throws IOException {       ZipEntry zipEntry = new ZipEntry(relativePath);       zos.putNextEntry(zipEntry);       zos.closeEntry();   }   /** *//**    * 解压缩zip包    *     * @param zipFilePath    *            zip文件路径    * @param targetPath    *            解压缩到的位置,如果为null或空字符串则默认解压缩到跟zip包同目录跟zip包同名的文件夹下    * @throws IOException    * @author yayagepei    * @date 2008-9-28    */   public static void unzip(String zipFilePath, String targetPath)           throws IOException {       OutputStream os = null;       InputStream is = null;       ZipFile zipFile = null;       try {           zipFile = new ZipFile(zipFilePath);           String directoryPath = "";           if (null == targetPath || "".equals(targetPath)) {               directoryPath = zipFilePath.substring(0, zipFilePath                       .lastIndexOf("."));           } else {               directoryPath = targetPath;           }           Enumeration entryEnum = zipFile.getEntries();           if (null != entryEnum) {               ZipEntry zipEntry = null;               while (entryEnum.hasMoreElements()) {                   zipEntry = (ZipEntry) entryEnum.nextElement();                   if (zipEntry.isDirectory()) {                       directoryPath = directoryPath + File.separator                               + zipEntry.getName();                       System.out.println(directoryPath);                       continue;                   }                   if (zipEntry.getSize() > 0) {                       // 文件                       File targetFile = FileUtil.buildFile(directoryPath                               + File.separator + zipEntry.getName(), false);                       os = new BufferedOutputStream(new FileOutputStream(                               targetFile));                       is = zipFile.getInputStream(zipEntry);                       byte[] buffer = new byte[4096];                       int readLen = 0;                       while ((readLen = is.read(buffer, 0, 4096)) >= 0) {                           os.write(buffer, 0, readLen);                       }                       os.flush();                       os.close();                   } else {                       // 空目录                       FileUtil.buildFile(directoryPath + File.separator                               + zipEntry.getName(), true);                   }               }           }       } catch (IOException ex) {           throw ex;       } finally {           if(null != zipFile){               zipFile = null;           }           if (null != is) {               is.close();           }           if (null != os) {               os.close();           }       }   }230}  补充一下里面用到的一个自己写的FileUtil的一个方法/**     * 生产文件 如果文件所在路径不存在则生成路径     *      * @param fileName     *            文件名 带路径     * @param isDirectory 是否为路径     * @return     * @author yayagepei     * @date 2008-8-27     */    public static File buildFile(String fileName, boolean isDirectory) {        File target = new File(fileName);        if (isDirectory) {            target.mkdirs();        } else {            if (!target.getParentFile().exists()) {                target.getParentFile().mkdirs();                target = new File(target.getAbsolutePath());            }        }        return target;    }

0 0
原创粉丝点击