zip文件解压 java

最近在做zip包的解压,遇到了问题。

1.如何成功进行zip包的解压;

2.如何提高zip包解压的速度。

   注:速度的提高主要体现在解压时使用的jar包,是java自带的还是apache的。听师哥说java的zip类打开zip文件的目录快,但是解压慢。apache的包解压速度快些,但是遍历zip包条目速度慢。这种说法还带考证,电脑今天卡的紧,只有回头测了。

   不过肯定的是,只有apache的包才支持带中文名文件的zip包解压。

1.首先使用java自带的zip解压功能进行了解压,(如果压缩包中有中文名文件不能正常解压)

代码如下:

package com.huawei.action;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;

public class Unzip
{
    private static final int BUFFER = 2048;

    public static void main(String[] args)
    {
        String filePath = "C:\test\test.zip";
        String desPath = filePath.substring(0, filePath.lastIndexOf("\"))
                + "\";
        int count = 0;
        byte[] a = new byte[BUFFER];
        File file = new File(filePath);
        if (!file.exists())
        {
            return;
        }
        try
        {
            ZipFile zipfile = new ZipFile(file);
            Enumeration<? extends ZipEntry> enu = zipfile.entries();
            while (enu.hasMoreElements())
            {
                ZipEntry entry = enu.nextElement();
                //如果zip条目为目录,则直接创建
                if (entry.isDirectory())
                {
                    new File(desPath + entry.getName()).mkdirs();
                    continue;
                }
                File desFile = new File(desPath + entry.getName());
                if (!desFile.exists())
                {
                    desFile.createNewFile();
                }
                FileOutputStream fos = new FileOutputStream(desFile);
                BufferedOutputStream bos = new BufferedOutputStream(fos, BUFFER);
                BufferedInputStream zis = new BufferedInputStream(
                        zipfile.getInputStream(entry));
                while ((count = zis.read(a, 0, BUFFER)) != -1)
                {
                    bos.write(a, 0, count);
                }
                bos.flush();
                bos.close();
                zis.close();
            }
            zipfile.close();
        } catch (ZipException e)
        {
            e.printStackTrace();
        } catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}

2.使用org.apache.tools.zip工具类,可实现中文文件名称的解压。

其中 

1、使用时把ant.jar放到classpath中,程序中使用import org.apache.tools.zip.*;
2、Apache Ant 下载地址http://ant.apache.org

3.  Ant ZIP API:  http://www.jajakarta.org/ant/ant-1.6.1/docs/mix/manual/api/org/apache/tools/zip/

代码基本没变,只是引用的包变为了apache的

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Enumeration;

import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;

public class Unzip
{
    private static final int BUFFER = 2048;

    public static void main(String[] args)
    {
        String filePath = "C:\test\test.zip";
        String desPath = filePath.substring(0, filePath.lastIndexOf("\"))
                + "\";
        int count = 0;
        byte[] a = new byte[BUFFER];
        File file = new File(filePath);
        if (!file.exists())
        {
            return;
        }
        try
        {
            ZipFile zipfile = new ZipFile(file);
            Enumeration<? extends ZipEntry> enu = zipfile.getEntries();
            while (enu.hasMoreElements())
            {
                ZipEntry entry = enu.nextElement();
                // 如果zip条目为目录,则直接创建
                if (entry.isDirectory())
                {
                    new File(desPath + entry.getName()).mkdirs();
                    continue;
                }
                File desFile = new File(desPath + entry.getName());
                if (!desFile.exists())
                {
                    desFile.createNewFile();
                }
                FileOutputStream fos = new FileOutputStream(desFile);
                BufferedOutputStream bos = new BufferedOutputStream(fos, BUFFER);
                BufferedInputStream zis = new BufferedInputStream(
                        zipfile.getInputStream(entry));
                while ((count = zis.read(a, 0, BUFFER)) != -1)
                {
                    bos.write(a, 0, count);
                }
                bos.flush();
                bos.close();
                zis.close();
            }
            zipfile.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}
原文地址:https://www.cnblogs.com/CanWork/p/3330822.html