?
?1
package
?util;
?2
?3
/**/
/*
本實例采用遞歸的方法,把指定的目錄(包括子目錄)壓縮成一個ZIP文件。
?4
原理是:為指定目錄的所有文件創建一個ZipEntry(壓縮流入口),然后把文件寫進去;當遇到子目錄時,調用遞歸函數,把它壓縮成另一個zip文件,當作一般文件寫進去.
?5
//使用方法?java?Zip?<目錄名>
?6
*/
?7
?8
//
java.util.zip包提供了數據壓縮和解壓縮的類
?9
import
?java.io.
*
;
10
import
?java.util.zip.
*
;
11
12
13
public
?
class
?FileZip
{
14
????
15
????
static
?
final
?
int
?BUFFER
=
2048
;?
16
????
static
?
boolean
?flag
=
false
;
17
????
18
????
public
?
static
?
void
?main(String?args[])
throws
?IOException
{
19
????????File?file
=
new
?File(args[
0
]);
20
????????FileInputStream?file1
=
new
?FileInputStream(ZipSubdirectory(file));
21
????}
22
????
23
????
//
ZipSubdirectory函數將一個指定目錄(包括它子目錄)壓縮成一個同名壓縮文件(這里稱為"ORIGIN")
24
????
public
?
static
?File?ZipSubdirectory(File?myDir)
throws
?IOException
{
25
????
//
創建緩沖輸入流BufferedInputStream?
26
????BufferedInputStream?origin
=
null
;
27
????
//
創建ZipOutputStream對象,將向它傳遞希望寫入文件的輸出流
28
????File?zipFile
=
new
?File(myDir.getName()
+
"
.zip
"
);
29
????FileOutputStream?fos
=
new
?FileOutputStream(zipFile);
30
????ZipOutputStream?out
=
new
?ZipOutputStream(
new
?BufferedOutputStream(fos,BUFFER));
31
????
//
dirContents[]獲取當前目錄(myDir)所有文件對象(包括子目錄名)
32
????File?dirContents[]
=
myDir.listFiles();
33
????
//
創建臨時文件tempFile,使用后刪除
34
????File?tempFile
=
null
;?
35
????
try
{
36
????????
//
處理當前目錄所有文件對象,包括子目錄
37
????????
for
(
int
?i
=
0
;i
<
dirContents.length;i
++
)
{
38
????????????
//
使用遞歸方法將當前目錄的子目錄轉成一個ZIP文件,并作為一個ENTRY加進"ORIGIN"?
39
????????????
if
(dirContents[i].isDirectory())
{
40
????????????????tempFile
=
ZipSubdirectory(dirContents[i]);
41
????????????????flag
=
true
;
42
????????????}
43
????????????
//
如果當前文件不是子目錄
44
????????????
else
{
45
????????????????tempFile
=
dirContents[i];
46
????????????????
//
flag標記tempFile是否由子目錄壓縮成的ZIP文件
47
????????????????flag
=
false
;
48
????????????}
49
????????????
50
????????????System.out.println(
"
Compress?file:?
"
+
tempFile.getName());
51
????????????
52
????????????FileInputStream?fis
=
new
?FileInputStream(tempFile);
53
????????????origin
=
new
?BufferedInputStream(fis,BUFFER);
54
????????????
//
為被讀取的文件創建壓縮條目
55
????????????ZipEntry?entry
=
new
?ZipEntry(tempFile.getName());
56
????????????
byte
?data[]
=
new
?
byte
[BUFFER];
57
????????????
int
?count;
58
????????????
//
在向ZIP輸出流寫入數據之前,必須首先使用out.putNextEntry(entry);?方法安置壓縮條目對象?
59
????????????out.putNextEntry(entry);
60
????????????
61
????????????
//
向ZIP?文件寫入數據?
62
????????????
while
((count
=
origin.read(data,
0
,BUFFER))
!=-
1
)
{
63
????????????????out.write(data,
0
,count);
64
????????????}
65
????????????
66
????????????
//
tempFile是臨時生成的ZIP文件,刪除它
67
????????????
if
(flag
==
true
)
{
68
????????????????flag
=
tempFile.delete();
69
????????????????System.out.println(
"
Delete?file:
"
+
tempFile.getName()
+
flag);?
70
????????????}
?
71
????????????
//
關閉輸入流?
72
????????????origin.close();?
73
????????}
74
????????out.close();
75
????}
76
????
catch
(Exception?e)
{System.out.println(e);
77
????}
78
????
//
遞歸返回?
79
????
return
?zipFile;?
80
????}
81
}
82
posted on 2006-04-21 17:11
kelven 閱讀(1027)
評論(0) 編輯 收藏 所屬分類:
java