服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|JavaScript|易语言|

服务器之家 - 编程语言 - JAVA教程 - Java压缩文件工具类ZipUtil使用方法代码示例

Java压缩文件工具类ZipUtil使用方法代码示例

2021-02-23 11:21mao2080 JAVA教程

这篇文章主要介绍了Java压缩文件工具类ZipUtil使用方法代码示例,具有一定借鉴价值,需要的朋友可以参考下。

本文实例通过Java的Zip输入输出流实现压缩和解压文件,前一部分代码实现获取文件路径,压缩文件名的更改等,具体如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
package com.utility.zip;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
import com.utility.io.IOUtil;
/**
 * 通过Java的Zip输入输出流实现压缩和解压文件
 *
 * @author liujiduo
 *
 */
public final class ZipUtil {
    private ZipUtil() {
        // empty
    }
    /**
   * 压缩文件
   *
   * @param filePath
   *      待压缩的文件路径
   * @return 压缩后的文件
   */
    public static File zip(String filePath) {
        File target = null;
        File source = new File(filePath);
        if (source.exists()) {
            // 压缩文件名=源文件名.zip
            String zipName = source.getName() + ".zip";
            target = new File(source.getParent(), zipName);
            if (target.exists()) {
                target.delete();
                // 删除旧的文件
            }
            FileOutputStream fos = null;
            ZipOutputStream zos = null;
            try {
                fos = new FileOutputStream(target);
                zos = new ZipOutputStream(new BufferedOutputStream(fos));
                // 添加对应的文件Entry
                addEntry("/", source, zos);
            }
            catch (IOException e) {
                throw new RuntimeException(e);
            }
            finally {
                IOUtil.closeQuietly(zos, fos);
            }
        }
        return target;
    }
    /**
   * 扫描添加文件Entry
   *
   * @param base
   *      基路径
   *
   * @param source
   *      源文件
   * @param zos
   *      Zip文件输出流
   * @throws IOException
   */
    private static void addEntry(String base, File source, ZipOutputStream zos)
          throws IOException {
        // 按目录分级,形如:/aaa/bbb.txt
        String entry = base + source.getName();
        if (source.isDirectory()) {
            for (File file : source.listFiles()) {
                // 递归列出目录下的所有文件,添加文件Entry
                addEntry(entry + "/", file, zos);
            }
        } else {
            FileInputStream fis = null;
            BufferedInputStream bis = null;
            try {
                byte[] buffer = new byte[1024 * 10];
                fis = new FileInputStream(source);
                bis = new BufferedInputStream(fis, buffer.length);
                int read = 0;
                zos.putNextEntry(new ZipEntry(entry));
                while ((read = bis.read(buffer, 0, buffer.length)) != -1) {
                    zos.write(buffer, 0, read);
                }
                zos.closeEntry();
            }
            finally {
                IOUtil.closeQuietly(bis, fis);
            }
        }
    }
    /**
   * 解压文件
   *
   * @param filePath
   *      压缩文件路径
   */
    public static void unzip(String filePath) {
        File source = new File(filePath);
        if (source.exists()) {
            ZipInputStream zis = null;
            BufferedOutputStream bos = null;
            try {
                zis = new ZipInputStream(new FileInputStream(source));
                ZipEntry entry = null;
                while ((entry = zis.getNextEntry()) != null
                            && !entry.isDirectory()) {
                    File target = new File(source.getParent(), entry.getName());
                    if (!target.getParentFile().exists()) {
                        // 创建文件父目录
                        target.getParentFile().mkdirs();
                    }
                    // 写入文件
                    bos = new BufferedOutputStream(new FileOutputStream(target));
                    int read = 0;
                    byte[] buffer = new byte[1024 * 10];
                    while ((read = zis.read(buffer, 0, buffer.length)) != -1) {
                        bos.write(buffer, 0, read);
                    }
                    bos.flush();
                }
                zis.closeEntry();
            }
            catch (IOException e) {
                throw new RuntimeException(e);
            }
            finally {
                IOUtil.closeQuietly(zis, bos);
            }
        }
    }
    public static void main(String[] args) {
        String targetPath = "E:\\Win7壁纸";
        File file = ZipUtil.zip(targetPath);
        System.out.println(file);
        ZipUtil.unzip("F:\\Win7壁纸.zip");
    }
}

下面是通过IO流工具类实现关闭一个或多个流对象的Java语言描述,获取可关闭的流对象列表,具体如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package com.utility.io;
import java.io.Closeable;
import java.io.IOException;
/**
 * IO流工具类
 *
 * @author liujiduo
 *
 */
public class IOUtil {
    /**
   * 关闭一个或多个流对象
   *
   * @param closeables
   *      可关闭的流对象列表
   * @throws IOException
   */
    public static void close(Closeable... closeables) throws IOException {
        if (closeables != null) {
            for (Closeable closeable : closeables) {
                if (closeable != null) {
                    closeable.close();
                }
            }
        }
    }
    /**
   * 关闭一个或多个流对象
   *
   * @param closeables
   *      可关闭的流对象列表
   */
    public static void closeQuietly(Closeable... closeables) {
        try {
            close(closeables);
        }
        catch (IOException e) {
            // do nothing
        }
    }
}

总结

以上就是本文关于Java压缩文件工具类ZipUtil使用方法代码示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。

原文链接:https://www.cnblogs.com/mao2080/p/7435268.html

延伸 · 阅读

精彩推荐
  • JAVA教程深入讲解Java编程中类的生命周期

    深入讲解Java编程中类的生命周期

    这篇文章主要介绍了深入讲解Java编程中类的生命周期,在带有垃圾回收功能的Java虚拟机上运行的程序中类的生命周期就显得格外重要,需要的朋友可以参考下...

    卡奴达摩4062020-08-11
  • JAVA教程Java 中HashCode作用_动力节点Java学院整理

    Java 中HashCode作用_动力节点Java学院整理

    这篇文章主要介绍了Java 中HashCode作用以及hashcode对于一个对象的重要性,对java中hashcode的作用相关知识感兴趣的朋友一起学习吧...

    动力节点1672020-09-28
  • JAVA教程spring boot集成rabbitmq的实例教程

    spring boot集成rabbitmq的实例教程

    这篇文章主要给大家介绍了关于spring boot集成rabbitmq的相关资料,springboot集成RabbitMQ非常简单,文中通过示例代码介绍的非常详细,需要的朋友们可以参考借...

    陈凡了6592021-01-29
  • JAVA教程java通过url读取文件内容示例

    java通过url读取文件内容示例

    这篇文章主要介绍了java通过url读取文件内容示例,大家参考使用吧 ...

    java教程网3252019-11-01
  • JAVA教程并发编程把我整的是服服气气的了

    并发编程把我整的是服服气气的了

    阿粉因为原来的编程习惯,已经很久没有去考虑并发的问题了,结果之前在面试的问题就回答的不是很完善,而阿粉也用心学习了并发编程这一块的所有内...

    Java极客技术4122020-12-09
  • JAVA教程JVM 体系结构详解

    JVM 体系结构详解

    本文主要介绍了JVM体系结构的相关知识。具有很好的参考价值。下面跟着小编一起来看下吧 ...

    创心coder4082020-08-27
  • JAVA教程浅谈IDEA中Maven配置问题全解决

    浅谈IDEA中Maven配置问题全解决

    这篇文章主要介绍了浅谈IDEA中Maven配置问题全解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下...

    CringKong4522020-07-25
  • JAVA教程idea2019.2安裝MybatisCodeHelper插件的超详细教程

    idea2019.2安裝MybatisCodeHelper插件的超详细教程

    这篇文章主要介绍了idea2019.2安裝MybatisCodeHelper插件的教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考...

    edda_huang4052020-09-29