利用org.apache.tools.zip包处理zip格式压缩和解压

转自:http://hi.baidu.com/xinghun_4/blog/item/2fb85dd89fc2082411df9be0.html

最近在做这个方面的处理时,我在网络上google了许多出来,但是很多都不能解决问题,老是出现问题,后来看来org.apache.tools.zip包中几个函数的源码才弄明白,当用org.apache.tools.zip解压时利用了Enumeration类,获得的zipEntry是无序的,所有老说找不到路径,或者说目录不存在,于是写了createDirectory方法,下面是我创建的类。有什么好的方法希望大家能分享一下。

/**
* @(#)ZipManager.java
*java.util.zip包提供了数据压缩和解压缩的类
*使用java自带的类 java.util.zip进行文件/目录的压缩的话,有一点不足,
*不支持中文的名件/目录命名,
*如果有中文名,那么打包就会失败。
*发现在一般的Ant.jar类库中也有zip类,import org.apache.tools.zip.*,
*能够解决不支持中文文件目录的问题.
*org.apache.tools.zip包毕竟它没有提供ZipInputStream类,
*因此只好用getEtries获得枚举类型的实体集,
*这样就破坏了实体间的级联关系,因此处理起来没有util.zip包方便了。
*这就是为什么我要在ZipManager类中创建createDirectory这个函数的本质所在。
*代码中所有的System.out.println输出的都是调试信息。
* @author xinghun_4
* @version 1.00 2009/4/1
*/
package mypackage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.util.Enumeration;
import org.apache.tools.zip.ZipOutputStream;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipEntry;

public class ZipManager extends Manager
{
private String srcPath;
private String desPath;
private int buffer;

    public ZipManager()
    {
    srcPath = "";
    desPath = "";
    buffer = 1024;
    }
   
    public void setsrcPath(String srcPath)
    {
    this.srcPath = srcPath;
    }
   
    public String getsrcPath()
    {
    return srcPath;
    }
   
    public void setdesPath(String desPath)
    {
    this.desPath = desPath;
    }
   
    public String getdesPath()
    {
    return desPath;
    }
   
    private boolean isdesPathNull()
    {
    return (desPath.length() == 0);
    }
   
    private boolean issrcPathNull()
    {
    return (srcPath.length() == 0);
    }
      
    public void zip()
    {
    if(issrcPathNull())
    {
       System.out.println("请设置要压缩的文件或目录路径!");
       return;
    }
    if(isdesPathNull())
    {
       System.out.println("请设置压缩文件保存路径!");
       return;
    }
    try
    {
       System.out.println("压缩的文件或目录:" + srcPath);
       System.out.println("压缩到:" + desPath);
       FileOutputStream fos = new FileOutputStream(new File(desPath));
       ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(fos,buffer));
       File inputFile = new File(srcPath);
       zip(out, inputFile, "");
    out.close();
    System.out.println("压缩完毕!");
    }
    catch(Exception e)
    {
       System.out.println(e);
    }
    }
   
    private void zip(ZipOutputStream out, File inputFile, String base)
    {
    try
    {
       if(inputFile.isDirectory())
       {
        File[] file = inputFile.listFiles();
        out.putNextEntry(new org.apache.tools.zip.ZipEntry(base + "/"));
        System.out.println("压缩路径:" + base + "/");
        base = (base.length() == 0) ? "" : (base + "/");
     for(int i = 0; i < file.length; i++)
     {
         zip(out, file[i], base + file[i].getName());
     }
       }
       else
       {
        out.putNextEntry(new org.apache.tools.zip.ZipEntry(base));
        byte[] data = new byte[buffer];
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(inputFile), buffer);
        System.out.println("正在压缩文件:" + base);
        int cnt;
        while((cnt = bis.read(data, 0 , buffer)) != -1)
        {
         out.write(data, 0, buffer);
        }
        out.flush();
        bis.close();
       }
    }
    catch(Exception e)
    {
       System.out.println(e);
    }
    }
   
    public void unzip()
    {
    if(issrcPathNull())
    {
       System.out.println("请设置要解压的zip文件!");
       return;
    }
    if(isdesPathNull())
    {
       System.out.println("请设置文件解压的路径!");
       return;
    }
    File outFile = new File(desPath);
    if (!outFile.exists()) {
            outFile.mkdirs();
        }
    try
    {
       ZipFile zipFile = new ZipFile(srcPath);
       Enumeration en = zipFile.getEntries();
       ZipEntry zipEntry = null;
       createDirectory(desPath.replace("//","/"),"");
       while (en.hasMoreElements())
       {
        zipEntry = (ZipEntry) en.nextElement();
        int index = zipEntry.getName().lastIndexOf("/");
        if(index == -1) index = 0;
        createDirectory(desPath.replace("//","/"),zipEntry.getName().substring(0,index));
        if (zipEntry.isDirectory())
        {
         continue;
        }
        else
        {
         File file = new File(outFile.getPath() + "/" + zipEntry.getName());
         System.out.println("正在解压文件:" + zipEntry.getName());
         file.createNewFile();
         BufferedInputStream bis = new BufferedInputStream(zipFile.getInputStream(zipEntry),buffer);
         BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(file),buffer);
         int cnt;
         byte[] data = new byte[buffer];
         while((cnt = bis.read(data, 0, buffer)) != -1)
         {
          out.write(data, 0, cnt);
         }
         bis.close();
         out.close();
         System.out.println(zipEntry.getName() + "解压完毕!");
        }
       }
       System.out.println("解压完毕!");
    }
    catch(Exception e)
    {
       System.out.println(e);
    }
    }
   
    private static void createDirectory(String directory, String subDirectory)
    {
        String[] dir;
        System.out.println("传过来的subDirectory: " + subDirectory);
        File file = new File(directory);
        try
        {
            if ((subDirectory.length() == 0) && (!file.exists()))
                file.mkdirs();
            else if (subDirectory.length() != 0)
            {
            dir = subDirectory.replace("//", "/").split("/");
            String temstr = directory;
            File temfile = null;
            for(int i = 0; i < dir.length; i++)
            {
               System.out.println("分离的目录名:" + dir[i]);
               temstr += "/" + dir[i];
               temfile = new File(temstr);
               if(!temfile.exists())
               {
                System.out.println("创建目录:" + temstr);
                boolean bl = temfile.mkdir();
                System.out.println("创建目录:" + bl);
               }
               else
               {
                System.out.println(temstr + "目录已存在!");
               }
            }
            }
        }
        catch (Exception e)
        {
            System.out.println(e);
        }
    }
   
    public void delete()
    {
    if(issrcPathNull())
    {
       System.out.println("请设置要删除的文件或目录!");
       return;
    }
    File file = new File(srcPath);
    if(!file.exists())
    {
       System.out.println("您要删除的文件或目录不存在!");
       return;
    }
    System.out.println("您要删除的文件或目录:" + file.getPath());
    delete(file);
    System.out.println("删除目录完毕!");
    }
   
    public void delete(File file)
    {
    try
    {
       if(file.isDirectory())
       {
        File[] f = file.listFiles();
        for(int i = 0; i < f.length; i++)
        {
         delete(f[i]);
        }
        file.delete();
        System.out.println(file.getName() + " 目录已删除!");
       }
       else
       {
        file.delete();
        System.out.println(file.getName() + " 文件已删除!");
       }
    }
    catch(Exception e)
    {
       System.out.println(e);
    }
    }
   
    public static void main (String[] args)
    {
    try
    {
       ZipManager dz = new ZipManager();
       dz.setdesPath("d:" + "/" + "测试.zip");
       dz.setsrcPath("e:" + "/" + "测试");
       dz.zip();

       dz.setsrcPath("d:" + "/" + "测试.zip");
       dz.setdesPath("d:" + "/" + "测试");
       dz.unzip();
      
       dz.setsrcPath("d:" + "/" + "测试");
       dz.delete();
    }
    catch(Exception e)
    {
       System.out.println(e);
    }
}
}

package com.cliff.common; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Enumeration; import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipFile; import org.apache.tools.zip.ZipOutputStream; /** * * 类名: ZipUtil.java * 描述:压缩/解压zip处理类 * 创建者:XXX * 创建日期:2015年5月7日 - 下午1:35:02 * 版本: V0.1 * 修改者: * 修改日期: */ public class ZipUtil { /** * * 功能描述:压缩文件 * 创建者:XXX * 创建日期: 2015年5月7日 - 下午1:35:18 * 版本: V0.1 * 修改者: * 修改日期: * @param directory 指定压缩文件路径 压缩到同目录 * @throws IOException * void */ public static void zip(String directory) throws FileNotFoundException, IOException { zip("", null, directory); } /** * * 功能描述:压缩文件 * 创建者:XXX * 创建日期: 2015年5月7日 - 下午1:36:03 * 版本: V0.1 * 修改者: * 修改日期: * @param zipFileName 压缩产生的zip文件名--带路径,如果为null或空则默认按文件名生产压缩文件名 * @param relativePath 相对路径,默认为空 * @param directory 文件或目录的绝对路径 * void */ 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(); } } } /** * * 功能描述:压缩文件 * 创建者:XXX * 创建日期: 2015年5月7日 - 下午1:37:55 * 版本: V0.1 * 修改者: * 修改日期: * @param zos 压缩输出流 * @param relativePath 相对路径 * @param absolutPath 文件或文件夹绝对路径 * @throws IOException * void */ 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); } } /** * * 功能描述:压缩文件 * 创建者:XXX * 创建日期: 2015年5月7日 - 下午1:38:46 * 版本: V0.1 * 修改者: * 修改日期: * @param zos 压缩输出流 * @param file 文件对象 * @param relativePath 相对路径 * @throws IOException * void */ 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 <= 0) { zos.write(buffer, 0, length); } zos.flush(); zos.closeEntry(); } catch (IOException ex) { throw ex; } finally { if (null != is) { is.close(); } } } /** * * 功能描述:创建目录 * 创建者:XXX * 创建日期: 2015年5月7日 - 下午1:39:12 * 版本: V0.1 * 修改者: * 修改日期: * @param zos zip输出流 * @param relativePath 相对路径 * @throws IOException * void */ private static void createZipNode(ZipOutputStream zos, String relativePath) throws IOException { ZipEntry zipEntry = new ZipEntry(relativePath); zos.putNextEntry(zipEntry); zos.closeEntry(); } /** * * 功能描述:解压缩文件 * 创建者:XXX * 创建日期: 2015年5月7日 - 下午1:39:32 * 版本: V0.1 * 修改者: * 修改日期: * @param zipFilePath zip文件路径 * @param targetPath 解压缩到的位置,如果为null或空字符串则默认解压缩到跟zip同目录跟zip同名的文件夹下 * void */ public static void unzip(String zipFilePath, String targetPath) throws IOException { InputStream is = null; FileOutputStream fileOut = null; File file = null; ZipFile zipFile = null; try { zipFile = new ZipFile(zipFilePath,"GBK"); String directoryPath = ""; if (null == targetPath || "".equals(targetPath)) { directoryPath = zipFilePath.substring(0, zipFilePath.lastIndexOf(".")); } else { directoryPath = targetPath; } for(Enumeration entries = zipFile.getEntries(); entries.hasMoreElements();){ ZipEntry entry = (ZipEntry)entries.nextElement(); file = new File(directoryPath+"/"+entry.getName()); if(entry.isDirectory()){ file.mkdirs(); }else{ //如果指定文件的目录不存在,则创建之. File parent = file.getParentFile(); if(!parent.exists()){ parent.mkdirs(); } is = zipFile.getInputStream(entry); fileOut = new FileOutputStream(file); int readLen = 0; byte[] buffer = new byte[4096]; while ((readLen = is.read(buffer, 0, 4096)) >= 0) { fileOut.write(buffer, 0, readLen); } fileOut.close(); is.close(); } } zipFile.close(); } catch (IOException ex) { throw ex; } finally { if(null != zipFile){ zipFile = null; } if (null != is) { is.close(); } if (null != fileOut) { fileOut.close(); } } } /** * * 功能描述:生产文件 如果文件所在路径不存在则生成路径 * 创建者:XXX * 创建日期: 2015年5月7日 - 下午1:41:04 * 版本: V0.1 * 修改者: * 修改日期: * @param fileName 文件名 带路径 * @param isDirectory 是否为路径 * @return * File */ 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; } }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值