本文實例講述了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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
|
import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Enumeration; import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipFile; import org.apache.tools.zip.ZipOutputStream; public class ZipUtil { private static final int BUFFEREDSIZE = 1024 ; /** * 壓縮文件 * * @param zipFileName * 保存的壓縮包文件路徑 * @param filePath * 需要壓縮的文件夾或者文件路徑 * @param isDelete * 是否刪除源文件 * @throws Exception */ public void zip(String zipFileName, String filePath, boolean isDelete) throws Exception { zip(zipFileName, new File(filePath), isDelete); } /** * 壓縮文件 * * @param zipFileName * 保存的壓縮包文件路徑 * @param inputFile * 需要壓縮的文件夾或者文件 * @param isDelete * 是否刪除源文件 * @throws Exception */ public void zip(String zipFileName, File inputFile, boolean isDelete) throws Exception { ZipOutputStream out = new ZipOutputStream( new FileOutputStream(zipFileName)); if (!inputFile.exists()) { throw new FileNotFoundException( "在指定路徑未找到需要壓縮的文件!" ); } zip(out, inputFile, "" , isDelete); out.close(); } /** * 遞歸壓縮方法 * * @param out * 壓縮包輸出流 * @param f * 需要壓縮的文件 * @param base * 壓縮的路徑 * @param isDelete * 是否刪除源文件 * @throws Exception */ private void zip(ZipOutputStream out, File inputFile, String base, boolean isDelete) throws Exception { if (inputFile.isDirectory()) { // 如果是目錄 File[] inputFiles = inputFile.listFiles(); out.putNextEntry( new ZipEntry(base + "/" )); base = base.length() == 0 ? "" : base + "/" ; for ( int i = 0 ; i < inputFiles.length; i++) { zip(out, inputFiles[i], base + inputFiles[i].getName(), isDelete); } } else { // 如果是文件 if (base.length() > 0 ) { out.putNextEntry( new ZipEntry(base)); } else { out.putNextEntry( new ZipEntry(inputFile.getName())); } FileInputStream in = new FileInputStream(inputFile); try { int len; byte [] buff = new byte [BUFFEREDSIZE]; while ((len = in.read(buff)) != - 1 ) { out.write(buff, 0 , len); } } catch (IOException e) { throw e; } finally { in.close(); } } if (isDelete) { inputFile.delete(); } } /** * 解壓縮 * * @param zipFilePath * 壓縮包路徑 * @param fileSavePath * 解壓路徑 * @param isDelete * 是否刪除源文件 * @throws Exception */ public void unZip(String zipFilePath, String fileSavePath, boolean isDelete) throws Exception { try { ( new File(fileSavePath)).mkdirs(); File f = new File(zipFilePath); if ((!f.exists()) && (f.length() <= 0 )) { throw new Exception( "要解壓的文件不存在!" ); } ZipFile zipFile = new ZipFile(f); String strPath, gbkPath, strtemp; File tempFile = new File(fileSavePath); // 從當前目錄開始 strPath = tempFile.getAbsolutePath(); // 輸出的絕對位置 Enumeration<ZipEntry> e = zipFile.getEntries(); while (e.hasMoreElements()) { org.apache.tools.zip.ZipEntry zipEnt = e.nextElement(); gbkPath = zipEnt.getName(); if (zipEnt.isDirectory()) { strtemp = strPath + File.separator + gbkPath; File dir = new File(strtemp); dir.mkdirs(); continue ; } else { // 讀寫文件 InputStream is = zipFile.getInputStream(zipEnt); BufferedInputStream bis = new BufferedInputStream(is); gbkPath = zipEnt.getName(); strtemp = strPath + File.separator + gbkPath; // 建目錄 String strsubdir = gbkPath; for ( int i = 0 ; i < strsubdir.length(); i++) { if (strsubdir.substring(i, i + 1 ).equalsIgnoreCase( "/" )) { String temp = strPath + File.separator + strsubdir.substring( 0 , i); File subdir = new File(temp); if (!subdir.exists()) subdir.mkdir(); } } FileOutputStream fos = new FileOutputStream(strtemp); BufferedOutputStream bos = new BufferedOutputStream(fos); int len; byte [] buff = new byte [BUFFEREDSIZE]; while ((len = bis.read(buff)) != - 1 ) { bos.write(buff, 0 , len); } bos.close(); fos.close(); } } } catch (Exception e) { e.printStackTrace(); throw e; } if (isDelete) { new File(zipFilePath).delete(); } } // public static void main(String[] args) { // ZipUtil cpr = new ZipUtil(); // try { // cpr.zip("C:/Users/Lenovo User/Desktop/test中文.zip", "C:/Users/Lenovo User/Desktop/新建文件夾", false); // cpr.unZip("C:/Users/Lenovo User/Desktop/test中文.zip", "C:/Users/Lenovo User/Desktop/新建文件夾2", false); // } catch (Exception e) { // e.printStackTrace(); // } // // } } |
希望本文所述對大家java程序設計有所幫助。
原文鏈接:http://blog.csdn.net/soundfly/article/details/16861881