zoukankan      html  css  js  c++  java
  • 文件压缩,解压缩的方法

    转载自:http://www.cnblogs.com/yayagepei/articles/1309789.html

       因为项目要用到压缩、解压缩zip格式压缩包,只好自己封装一个,对于网上流行的中文乱码的问题,本文的解决方法是用apache的包代替jdk里的。基本上还是比较好用的。

        废话少说,直接上代码。

    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;

        }

    其中import org.apache.tools.zip.ZipEntry;

    在maven中的依赖是:

    <dependency>
                <groupId>ant</groupId>
                <artifactId>ant</artifactId>
                <version>1.6.5</version>
            </dependency>

    因为它属于ant包中

  • 相关阅读:
    物流与仓库
    测试使用
    禅修的升级
    《引爆点 马尔科姆 格拉德威尔》读书笔记总结----《创业必读书第20本》--创业第三关做好业务:3,如何做好营销和增长第4本
    shell
    Vue中常用的方法记录
    前端工程化3-tapable
    Browser上传文件到华为云/七牛云 详细步骤
    immutable
    shell利用叮叮发送消息
  • 原文地址:https://www.cnblogs.com/zrui-xyu/p/4747929.html
Copyright © 2011-2022 走看看