博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java压缩和解压文件工具类ZipUtil
阅读量:4106 次
发布时间:2019-05-25

本文共 5520 字,大约阅读时间需要 18 分钟。

用于服务器端打包文件的,将压缩后的文件写入到response输出流即可实现在服务器端打包下载,支持多级目录嵌套。

测试时可以先用ZipUtil.zip压缩某个文件夹test,得到压缩文件test.zip,然后将文件夹test删除,用ZipUtil.unzip解压test.zip即可还原。


PS:需要解决中文乱码的朋友可以参考此处 http://log-cd.iteye.com/blog/585647

1. [文件] ZipUtil.java ~ 4KB     (147)     

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
144
145
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"
);
    
}
}

2. [文件] IOUtil.java ~ 815B     (155)        

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
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
        
}
    
}
 
}

 

  • 1楼:
    Bug_Killer 发表于 2015-05-19 17:03 
    阿多,猜猜我是谁
  • 2楼:
    liujiduo 发表于 2015-05-19 17:54 

    引用来自“Bug_Killer”的评论

    阿多,猜猜我是谁
    阿百 哈哈
  • 3楼:
    开源中国董事长 发表于 2015-05-21 12:50 
    你这个如果要打包的文件名有中文,会乱码的。用ant.jar里面的ZipEntry就可以解决。
  • 4楼:
    liujiduo 发表于 2015-05-21 13:10 

    引用来自“uk8692”的评论

    你这个如果要打包的文件名有中文,会乱码的。用ant.jar里面的ZipEntry就可以解决。
    嗯,有时间我再修改一下实现。
  • 5楼:
    番茄mc 发表于 2015-05-21 13:58 
    学习了

  • 6楼:
    田龙123 发表于 2015-05-22 15:12 
    解压完的文件内的内容没了

  • 7楼:
    renchhao 发表于 2015-05-25 16:26 
    不用说,
    BUG,
    看解压代码,,
    bos 未在for 循环中关闭。
  • 8楼:
    renchhao 发表于 2015-05-25 16:26 

    引用来自“田龙123”的评论

    解压完的文件内的内容没了

    不用说,BUG,看解压代码,,bos 未在for 循环中关闭。
  • 9楼:
    liujiduo 发表于 2015-05-25 19:08 

    引用来自“renchhao”的评论

    不用说,
    BUG,
    看解压代码,,
    bos 未在for 循环中关闭。
    已修正,多谢指出。
  • 10楼:
    liujiduo 发表于 2015-05-25 19:10 

    引用来自“田龙123”的评论

    解压完的文件内的内容没了

    已修正。
  • 11楼:
    山川尽美 发表于 2015-06-08 18:39 
    学习了 没发现问题
  • 12楼:
    double饭 发表于 2015-08-24 22:18 
    大触
  • 13楼:
    你的快递 发表于 2015-09-07 17:28 
    有个潜在bug: buffer 是静态共享成员变量 如遇并发就会出错

  • 14楼:
    liujiduo 发表于 2015-09-28 14:47 

    引用来自“你的快递”的评论

    有个潜在bug: buffer 是静态共享成员变量 如遇并发就会出错

    是哦,多谢指出,已修正。
  • 15楼:
    玩命 发表于 2016-04-26 11:43 
    压缩的时候,有中文出现乱码了。然后解压的时候,在while循环的条件,出现 java.lang.IllegalArgumentException异常

转载地址:http://xdnsi.baihongyu.com/

你可能感兴趣的文章
使用openssl将私钥转换为无密码私钥
查看>>
Iperf 带宽性能测试使用方法与参数说明
查看>>
Linux 修改MAC地址的四种方法介绍
查看>>
Ubuntu:永久修改MAC地址
查看>>
UDID解决办法
查看>>
”A valid provisioning profile for this executable was not found“解决方案
查看>>
用WinRAR解压7z.001格式的文件
查看>>
如何UIButton添加事件并传递参数
查看>>
关于Ubuntu下apt的一些用法及和yum的比较
查看>>
自定义UITableView的Header
查看>>
Nmap扫描原理与用法
查看>>
Ubuntu下利用系统创建xorg.conf文件
查看>>
ubuntu修改默认启动级别
查看>>
Vmware中装Linux Mint 15 添加 1600x900分辨率
查看>>
如何为Gnome3添加自启动程序
查看>>
Fedora 19 Mate环境安装Gnome3
查看>>
Fedora19启动时“出现无法应用原保存的显示器配置”解决办法
查看>>
景程手动空调面板故障,指示灯失灵修理记录
查看>>
Nginx通过CORS实现跨域
查看>>
Qt5.1.0 MSVC2012(32bit) release静态版编译结果分享
查看>>