详解java解压缩zip和rar的工具类使用教程直接上代码
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
|
package decompress;
import java.io.File;
import java.io.FileOutputStream;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.taskdefs.Expand;
import de.innosystec.unrar.Archive;
import de.innosystec.unrar.rarfile.FileHeader;
public
class
DeCompressUtil {
/**
* 解压zip格式压缩包
* 对应的是ant.jar
*/
private
static
void unzip(String sourceZip,String destDir) throws Exception{
try
{
Project p =
new
Project();
Expand e =
new
Expand();
e.setProject(p);
e.setSrc(
new
File(sourceZip));
e.setOverwrite(false);
e.setDest(
new
File(destDir));
/*
ant下的zip工具默认压缩编码为UTF-8编码,
而winRAR软件压缩是用的windows默认的GBK或者GB2312编码
所以解压缩时要制定编码格式
*/
e.setEncoding(
"gbk"
);
e.execute();
}
catch
(Exception e){
throw
e;
}
}
/**
* 解压rar格式压缩包。
* 对应的是java-unrar-0.3.jar,但是java-unrar-0.3.jar又会用到commons-logging-1.1.1.jar
*/
private
static
void unrar(String sourceRar,String destDir) throws Exception{
Archive a = null;
FileOutputStream fos = null;
try
{
a =
new
Archive(
new
File(sourceRar));
FileHeader fh = a.nextFileHeader();
while
(fh!=null){
if
(!fh.isDirectory()){
//1 根据不同的操作系统拿到相应的 destDirName 和 destFileName
String compressFileName = fh.getFileNameString().trim();
String destFileName =
""
;
String destDirName =
""
;
//非windows系统
if
(File.separator.equals(
"/"
)){
destFileName = destDir + compressFileName.replaceAll(
"\\\\"
,
"/"
);
destDirName = destFileName.substring(0, destFileName.lastIndexOf(
"/"
));
//windows系统
}
else
{
destFileName = destDir + compressFileName.replaceAll(
"/"
,
"\\\\"
);
destDirName = destFileName.substring(0, destFileName.lastIndexOf(
"\\"
));
}
//2创建文件夹
File dir =
new
File(destDirName);
if
(!dir.exists()||!dir.isDirectory()){
dir.mkdirs();
}
//3解压缩文件
fos =
new
FileOutputStream(
new
File(destFileName));
a.extractFile(fh, fos);
fos.close();
fos = null;
}
fh = a.nextFileHeader();
}
a.close();
a = null;
}
catch
(Exception e){
throw
e;
}
finally
{
if
(fos!=null){
try
{fos.close();fos=null;}
catch
(Exception e){e.printStackTrace();}
}
if
(a!=null){
try
{a.close();a=null;}
catch
(Exception e){e.printStackTrace();}
}
}
}
/**
* 解压缩
*/
public
static
void deCompress(String sourceFile,String destDir) throws Exception{
//保证文件夹路径最后是"/"或者"\"
char lastChar = destDir.charAt(destDir.length()-1);
if
(lastChar!=
'/'
&&lastChar!=
'\\'
){
destDir += File.separator;
}
//根据类型,进行相应的解压缩
String type = sourceFile.substring(sourceFile.lastIndexOf(
"."
)+1);
if
(type.equals(
"zip"
)){
DeCompressUtil.unzip(sourceFile, destDir);
}
else
if
(type.equals(
"rar"
)){
DeCompressUtil.unrar(sourceFile, destDir);
}
else
{
throw
new
Exception(
"只支持zip和rar格式的压缩包!"
);
}
}
}
|