由于需要,這幾天研究了一下使用Java技術實現文件及文件夾打zip包及解zip包,使用的是java.util.zip包下的類;主要用到的是三個類,即:ZipEntry,我的理解是zip文件中壓縮的一個個子文件;ZipInputStream是zip格式的輸入流;ZipOutputStream是zip格式的輸出流;
這方面網上也有一些例子,我也測試了相關的例子,但是在實現部分功能是有些不足,所以將代碼改造后重寫如下,現在實現的功能是對單個文件的打包及解包,對一個文件夾(文件夾內文件及文件夾不限)的打包及解包;
使用Java核心庫的不足就是如果對中文文件夾或文件打包后,文件名或文件夾名會出現亂碼,雖然在window下可以正常的解壓,解壓后也能正常顯示中文,但是對于Unix等系統則不具有通用性;網上能找的解決方式是使用Ant包中的zip類庫,Ant重寫了ZipOutputStream類,所以對于打包后正常顯示中文沒有問題,但是還是不能動態制定壓制zip文件的編碼;
1
import java.io.File;
2
import java.io.FileInputStream;
3
import java.io.FileNotFoundException;
4
import java.io.FileOutputStream;
5
import java.io.IOException;
6
import java.util.zip.ZipEntry;
7
import java.util.zip.ZipInputStream;
8
import java.util.zip.ZipOutputStream;
9
10
/** *//**
11
* 使用java核心類庫打包、解包zip文件,不足之處在于壓縮中文名的文件時,在壓縮包內中文字符是亂碼,
12
* 在windows下解壓后編碼正常顯示中文,而其他系統下則不能正常還原;
13
*/
14
public class TestZip
{
15
16
/** *//**
17
* 定義壓縮文件及目錄為zip文件的方法,重寫下面的zip方法
18
*
19
* @param zipFileName
20
* @param inputFile
21
* @throws Exception
22
*/
23
public void zip(String zipFileName, String inputFile)
{
24
zip(zipFileName, new File(inputFile));
25
}
26
27
/** *//**
28
* 定義壓縮文件及目錄為zip文件的方法,重寫下面的zip方法
29
*
30
* @param zipFileName
31
* @param inputFile
32
* @throws Exception
33
*/
34
public void zip(String zipFileName, File inputFile)
{
35
try
{
36
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(
37
zipFileName));
38
zip(out, inputFile, inputFile.getName());
39
System.out.println("zip done");
40
out.close();
41
}
42
catch (FileNotFoundException e)
{
43
// TODO 自動生成 catch 塊
44
e.printStackTrace();
45
}
46
catch (IOException e)
{
47
// TODO 自動生成 catch 塊
48
e.printStackTrace();
49
}
50
}
51
52
/** *//**
53
* 定義壓縮文件及目錄為zip文件的方法
54
*
55
* @param out
56
* @param f
57
* @param base
58
* @throws Exception
59
*/
60
public void zip(ZipOutputStream out, File f, String base)
{
61
try
{
62
System.out.println("Zipping " + f.getName());
63
//判斷File是否為目錄
64
if (f.isDirectory())
{
65
System.out.println("Read Directory !");
66
//獲取f目錄下所有文件及目錄,作為一個File數組返回
67
File[] fl = f.listFiles();
68
out.putNextEntry(new ZipEntry(base + "/"));
69
base = base.length() == 0 ? "" : base + "/";
70
for (int i = 0; i < fl.length; i++)
{
71
zip(out, fl[i], base + fl[i].getName());
72
}
73
}
74
else
{
75
System.out.println("Read File !");
76
out.putNextEntry(new ZipEntry(base));
77
FileInputStream in = new FileInputStream(f);
78
int b;
79
System.out.println("base " + base);
80
while ((b = in.read()) != -1)
{
81
// System.out.println("File reading
");
82
out.write(b);
83
}
84
in.close();
85
}
86
}
87
catch (FileNotFoundException e)
{
88
// TODO 自動生成 catch 塊
89
e.printStackTrace();
90
}
91
catch (IOException e)
{
92
// TODO 自動生成 catch 塊
93
e.printStackTrace();
94
}
95
}
96
97
/** *//**
98
* 定義解壓縮zip文件的方法
99
*
100
* @param zipFileName
101
* @param outputDirectory
102
*/
103
public void unzip(String zipFileName, String outputDirectory)
{
104
try
{
105
ZipInputStream in = new ZipInputStream(new FileInputStream(
106
zipFileName));
107
//獲取ZipInputStream中的ZipEntry條目,一個zip文件中可能包含多個ZipEntry,
108
//當getNextEntry方法的返回值為null,則代表ZipInputStream中沒有下一個ZipEntry,
109
//輸入流讀取完成;
110
ZipEntry z = in.getNextEntry();
111
while (z != null)
{
112
System.out.println("unziping " + z.getName());
113
//創建以zip包文件名為目錄名的根目錄
114
File f = new File(outputDirectory);
115
f.mkdir();
116
if (z.isDirectory())
{
117
String name = z.getName();
118
name = name.substring(0, name.length() - 1);
119
// System.out.println("name " + name);
120
f = new File(outputDirectory + File.separator + name);
121
f.mkdir();
122
// System.out.println("mkdir " + outputDirectory
123
// + File.separator + name);
124
}
125
else
{
126
f = new File(outputDirectory + File.separator + z.getName());
127
f.createNewFile();
128
FileOutputStream out = new FileOutputStream(f);
129
int b;
130
while ((b = in.read()) != -1)
{
131
out.write(b);
132
}
133
out.close();
134
}
135
//讀取下一個ZipEntry
136
z = in.getNextEntry();
137
}
138
in.close();
139
}
140
catch (FileNotFoundException e)
{
141
// TODO 自動生成 catch 塊
142
e.printStackTrace();
143
}
144
catch (IOException e)
{
145
// TODO 自動生成 catch 塊
146
e.printStackTrace();
147
}
148
}
149
150
public static void main(String[] args)
{
151
TestZip t = new TestZip();
152
// t.zip("c:\\test11.zip", "c:\\test1");
153
// t.zip("c:\\test2.zip", "c:\\php");
154
t.unzip("c:\\test11.zip", "c:\\test11");
155
//如果此處不指定解壓的具體目錄,如:test2,那么則直接解壓到根目錄下
156
// t.unzip("c:\\test2.zip", "c:\\test2");
157
}
158
}