文档章节

Java实现Zip文件解压

Elven_Xu
 Elven_Xu
发布于 2017/07/20 17:46
字数 550
阅读 20
收藏 1

##1. 两种java实现zip文件解压方式

  • 使用JDK的原生类java.util.zip,上代码:
import java.util.zip.*;
import java.io.*;

public class UnzipTest {
     public static void main(String[] args) {
          if (args.length != 1) {
               System.out.println("请输入正确参数:java UnzipTest 需解压的文件(e.g. d:/test.zip)");
          } else {
               Unzip unzip = new Unzip();
               if (unzip.unzip(args[0])) {
                    System.out.println("文件解压成功。");
               } else {
                    System.out.println("文件解压失败。");
               }
          }    
     }
}

class Unzip {
     public Unzip() {}

     /*
     * @param srcZipFile 需解压的文件名
     * @return  如果解压成功返回true
     */
     public boolean unzip(String srcZipFile) {
          boolean isSuccessful = true;
          try {
               BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcZipFile));
               ZipInputStream zis = new ZipInputStream(bis);

               BufferedOutputStream bos = null;

               //byte[] b = new byte[1024];
               ZipEntry entry = null;
               while ((entry=zis.getNextEntry()) != null) {
                    String entryName = entry.getName();
                    bos = new BufferedOutputStream(new FileOutputStream("d:/" + entryName));
                    int b = 0;
                    while ((b = zis.read()) != -1) {
                         bos.write(b);
                    }
                    bos.flush();
                    bos.close();
               }
               zis.close();
          } catch (IOException e) {
               isSuccessful = false;
          }
          return isSuccessful;
     }
}

这种解压方式会出现中文文件名乱码的问题。

  • 另一种实现zip文件解压的方式,使用 ant.jar 的org.apache.tools.zip包,上代码:
import java.io.*;
import java.util.Enumeration;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.taskdefs.Expand;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.mockito.internal.util.io.IOUtil;

public class Unzip {
    private static final String ENCODE = "UTF-8";
    /*
   * @param zipDir目标文件存放地,zipFile带解压文件
   * @return  如果解压成功返回true
   */
    public static boolean unzip(String zipDir, String zipFile) {
        ZipFile zfile = null;
        InputStream is = null;
        OutputStream os = null;
        try
        {
            zfile = new ZipFile(zipFile);
            Enumeration<?> zList = zfile.getEntries();
            ZipEntry ze = null;
            byte[] buf = new byte[1024];
            while (zList.hasMoreElements())
            {
                ze = (ZipEntry) zList.nextElement();
                if (ze.isDirectory())
                {
                    /*// 获得当前时间
                    DateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
                    // 转换为字符串
                    String formatDate = format.format(new Date());
                    // 随机生成文件编号
                    int random = new Random().nextInt(10000);*/
                    File f = new File(zipDir + ze.getName());
                    f.mkdir();
                    continue;
                }
                os = new BufferedOutputStream(new FileOutputStream(getRealFileName(zipDir, ze.getName())));
                is = new BufferedInputStream(zfile.getInputStream(ze));
                int readLen = 0;
                while ((readLen = is.read(buf, 0, 1024)) != -1)
                {
                    os.write(buf, 0, readLen);
                }
                IOUtil.closeQuietly(is);
                IOUtil.closeQuietly(os);
            }
            zfile.close();
            return true;
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        finally
        {
            IOUtil.closeQuietly(is);
            IOUtil.closeQuietly(os);
            try
            {
                if (null != zfile)
                {
                    zfile.close();
                }
            }
            catch (IOException ex)
            {
                // ignore
                System.out.println(ex);
            }
        }
        return false;
    }
    /**
     * 给定根目录,返回一个相对路径所对应的实际文件名.
     *
     * @param baseDir
     *            指定根目录
     * @param absFileName
     *            相对路径名,来自于ZipEntry中的name
     * @return java.io.File 实际的文件
     */
    public static File getRealFileName(String baseDir, String absFileName)
    {
        String[] dirs = absFileName.split("/");
        File ret = new File(baseDir);
        if (dirs.length > 1)
        {
            for (int i = 0; i < dirs.length - 1; i++)
            {
                ret = new File(ret, dirs[i]);
            }
            if (!ret.exists())
                ret.mkdirs();
            ret = new File(ret, dirs[dirs.length - 1]);
            return ret;
        }
        ret = new File(ret, dirs[dirs.length - 1]);
        return ret;
    }
}

ant.jar的maven依赖

<dependency>
    <groupId>org.apache.ant</groupId>
    <artifactId>ant</artifactId>
    <version>1.10.1</version>
</dependency>

第二种方法可以避免中文文件名乱码的问题。

© 著作权归作者所有

共有 人打赏支持
Elven_Xu
粉丝 11
博文 19
码字总数 9167
作品 0
镇江
后端工程师
私信 提问
配置Impala支持JDBC(翻译)

配置Impala支持JDBC Impala支持JDBC集成。通过使用 JDBC 驱动,你编写的 Java 程序、BI应用、或类似的使用 JDBC 访问不同数据库产品的工具,可以访问 Impala。建立到 Impala 的 JDBC 连接包括...

weiqingbin
2013/12/17
0
0
阿里Java架构师打包 FatJar 方法小结

在函数计算(Aliyun FC)中发布一个 Java 函数,往往需要将函数打包成一个 all-in-one 的 zip 包或者 jar 包。Java 中这种打包 all-in-one 的技术常称之为 Fatjar 技术。本文小结一下 Java 里打...

Java互联网架构师
08/29
0
0
Java 打包 FatJar 方法小结

在函数计算(Aliyun FC)中发布一个 Java 函数,往往需要将函数打包成一个 all-in-one 的 zip 包或者 jar 包。Java 中这种打包 all-in-one 的技术常称之为 Fatjar 技术。本文小结一下 Java 里打...

倚贤
08/28
0
0
linux C zip 压缩 字符串

项目需要通过zip压缩进行数据传输,linux c为客户端,java为服务端,通过TCP发送,目前已实现java版本的zip压缩解压缩。 现在还需要实现C客户端的zip压缩。 尝试使用zlib的compress,长度不一...

bigbear1007
2016/02/17
864
2
Windows 下安装 Open ModelSphere 建模工具

exe 版安装 首先确认已经安装了Java虚拟机,版本至少是 1.6 Update 14 或者更新 双击安装程序即可 zip 版安装 解压 zip 文件包 确认已经安装了Java虚拟机,版本至少是 1.6 Update 14 或者更新...

鉴客
2010/11/27
2.4K
1

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周一乱弹 —— 眼看着这颗陨石砸了下来

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子:分享Nachtblut的单曲《Antik》 《Antik》- Nachtblut 手机党少年们想听歌,请使劲儿戳(这里) @mr_chip :上海的初雪之后有点冷 ...

小小编辑
31分钟前
69
6
Confluence 6 修改导航显示选项

选择 子页面(Child pages)来在边栏中查看当前页面的子页面。 选择 页面树(Page tree)来查看整个空间的页面树,扩展当前的页面。 你也可以选择是否完全隐藏导航显示选项或者添加你希望可见...

honeymose
今天
2
0
Ubuntu18.04 安装MySQL

1.安装MySQL sudo apt-get install mysql-server 2.配置MySQL sudo mysql_secure_installation 3.设置MySQL非root用户 设置原因:配置过程为系统root权限,在构建MySQL连接时出现错误:ERROR...

AI_SKI
今天
3
0
3.6 rc脚本(start方法) 3.7 rc脚本(stop和status方法) 3.8 rc脚本(以daemon方式启动)

3.6-3.7 rc脚本(start、stop和status方法) #!/usr/bin/env python# -*- coding: utf-8 -*-# [@Version](https://my.oschina.net/u/931210) : python 2.7# [@Time](https://my.oschina.......

隐匿的蚂蚁
今天
3
0
Cnn学习相关博客

CNN卷积神经网络原理讲解+图片识别应用(附源码) 笨方法学习CNN图像识别系列 深度学习图像识别项目(中):Keras和卷积神经网络(CNN) 卷积神经网络模型部署到移动设备 使用CNN神经网络进行...

-九天-
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部