文档章节

Java实现Zip文件解压

Elven_Xu
 Elven_Xu
发布于 2017/07/20 17:46
字数 550
阅读 11
收藏 1
点赞 0
评论 0

##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
粉丝 10
博文 19
码字总数 9167
作品 0
镇江
后端工程师
Tomcat与Jre绿色环境配置(生产环境)

Tomcat与Jre绿色环境配置(生产环境)博客分类: Apache Java jreapachetomcat Tomcat运行时需要jre的支持,一般有两种方式,一种是用jdk带的jre,另一种无需安装jdk只利用jre。这两种方式的...

thinkyoung ⋅ 2015/12/31 ⋅ 0

tomcat中配置文件之setenv.sh

问题 怎么设置tomcat的配置java_opts环境变量,并且不影响整个操作系统的环境变量? 解决 安装Tomcat 下载Tomcat的zip包 解压zip包 给Tomcat执行权限 Tomcat的hello world 然后,去找个浏览器...

亚林瓜子 ⋅ 04/24 ⋅ 0

Linux下Tomcat的搭建以及开机自启动设置

首先进行下JDK的配置:   1.查看下系统信息,确认是32位还是64位:uname -a   2.下载相应位数的jdk压缩包,传到Linux系统,这里提供一个32位和64位的下载链接:https://pan.baidu.com/s...

武哥_话神 ⋅ 04/27 ⋅ 0

ubuntu16.0.4不能上网和jdk1.8环境配置

转载自: https://jingyan.baidu.com/article/6c67b1d68facbb2786bb1e7b.html 虽然设置的时候图标位置可能不太一样,但是操作步骤一样的,网上有说让在Windows下查看一下vmware的网络服务是否...

u011976443 ⋅ 05/25 ⋅ 0

windows7下使用vs2015编译gdal2.3

前期准备工作: 1,下载apache-ant-1.9.11工具软件,并解压到D:gdalapache-ant-1.9.11目录下,配置环境变量 ANT_HOME=D:gdalapache-ant-1.9.11 PATH=%PATH%;%ANT_HOME%bin 2,下载JDK1.8,用...

会哭的鳄鱼 ⋅ 前天 ⋅ 0

redhat 安装Rabbitmq

先安装JDK 安装erlang环境: 安装依赖文件:yum install gcc glibc-devel make ncurses-devel openssl-devel xmlto; yum install unixODBC-devel 解压erlang文件:tar -zxvf otpsrc19.2.ta......

ts88 ⋅ 04/23 ⋅ 0

bash: /home/jdk1.8.0_161/bin/java: Permission denied

bash: /home/jdk1.8.0_161/bin/java: Permission denied 2018年03月09日 09:04:59 阅读数:508 在ubuntu上安装jdk. 1.解压通过cuteFtp传到ubuntu服务器。 2.vim /etc/profile 编辑profile 文......

linjin200 ⋅ 05/11 ⋅ 0

Java压缩技术(一) ZLib

应好友需要,整理一下Java的压缩算法,先从ZLib开始。 相关链接: Java压缩技术(一) ZLib Java压缩技术(二) ZIP压缩——Java原生实现 Java压缩技术(三) ZIP解压缩——Java原生实现 Ja...

村长大神 ⋅ 2014/11/05 ⋅ 0

在Ubuntu16.04.4上安装jdk

一、安装步骤 1.下载jdk安装包 首先我们在oracle官网上下载jdk-8u161-linux-x64.tar.gz,当然也可以下载其他版本的。 2.创建java的安装目录,并且解压该安装包,这里没有固定的解压目录,很类...

oO维尼熊Oo ⋅ 05/03 ⋅ 0

Spring MVC-环境设置(转载实践)

以下内容翻译自:https://www.tutorialspoint.com/springmvc/springmvcenvironment_setup.htm 说明:示例基于Spring MVC 4.1.6。 步骤1-安装Java开发工具包(JDK): 您可以从Oracle的Java站...

easonjim ⋅ 2017/08/29 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

内核线程、轻量级进程、用户线程

线程与进程概念 在现代操作系统中,进程支持多线程。 进程是资源管理的最小单元; 线程是程序执行的最小单元。 即线程作为调度和分配的基本单位,进程作为资源分配的基本单位 一个进程的组成...

117 ⋅ 21分钟前 ⋅ 0

elasticsearch2.4.6升级为elasticsearch-5.5.0的经历

将elasticsearch-5.5.0 中的配置 path.data 指向原来的数据路径 即 path.data: /usr/local/src/elasticsearch-2.4.6/data 注意: elasticsearch-5.5.0 需要将jdk版本升级到1.8...

晨猫 ⋅ 22分钟前 ⋅ 1

lvm讲解 磁盘故障小案例

1

oschina130111 ⋅ 26分钟前 ⋅ 0

那些提升开发人员工作效率的在线工具

本文转载自公众号 Hollis 作为一个Java开发人员,经常要和各种各样的工具打交道,除了我们常用的IDE工具以外,其实还有很多工具是我们在日常开发及学习过程中要经常使用到的。 Hollis偏爱使用...

时刻在奔跑 ⋅ 38分钟前 ⋅ 0

restful风格 实现DELETE PUT请求 的web.xml的配置

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframe......

泉天下 ⋅ 43分钟前 ⋅ 0

Shell数组

Shell数组 Shell在编程方面比Windows批处理强大很多,无论是在循环、运算。 bash支持一维数组(不支持多维数组),并且没有限定数组的大小。类似与C语言,数组元素的下标由0开始编号。获取数...

蜗牛奔跑 ⋅ 53分钟前 ⋅ 0

nmap为了开发方便 可以做简单的修改

因为nmap扫描是默认使用的是nse脚本,但是在开发的过程中需要修改后缀(主要是因为后缀为lua才能显示高亮,所以这里用一个取巧的办法) nse_main.lua文件中我们找到如下代码 local t, path = cn...

超级大黑猫 ⋅ 57分钟前 ⋅ 0

springmvc获取axios数据为null情况

场景:前端用了vue没有用ajax与后台通信,用了axios,但是在代码运行过程中发现axios传递到后台的值接受到数据为null。 问题原因:此处的问题在与axios返回给后台的数据为json类型的,后台接...

王子城 ⋅ 59分钟前 ⋅ 0

hadoop技术入门学习之发行版选择

经常会看到这样的问题:零基础学习hadoop难不难?有的人回答说:零基础学习hadoop,没有想象的那么难,也没有想象的那么容易。看到这样的答案不免觉得有些尴尬,这个问题算是白问了,因为这个...

左手的倒影 ⋅ 59分钟前 ⋅ 0

806. Number of Lines To Write String - LeetCode

Question 806. Number of Lines To Write String Solution 思路:注意一点,如果a长度为4,当前行已经用了98个单元,要另起一行。 Java实现: public int[] numberOfLines(int[] widths, Str...

yysue ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部