服务器之家

服务器之家 > 正文

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

时间:2021-02-23 11:21     来源/作者:mao2080

本文实例通过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

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
Intellij idea2020永久破解,亲测可用!!!
Intellij idea2020永久破解,亲测可用!!! 2020-07-29
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
返回顶部